Delphi-PRAXiS
Seite 20 von 25   « Erste     10181920 2122     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Der XE8 Fehler-Thread (https://www.delphipraxis.net/184578-der-xe8-fehler-thread.html)

Harry Stahl 9. Mai 2015 15:58

AW: Der XE8 Fehler-Thread
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Sir Rufo (Beitrag 1300822)
Auch wenn die beiden Klassen aus der gleichen Unit stammen, sind die Klassen in der EXE und DLL anders und du darfst die nicht einfach so übergeben.

Inwiefern sind die Klassen anders? Also z.B. hier der TMemoryStream?

Zitat:

Zitat von Sir Rufo (Beitrag 1300822)
Alles andere führt zu komischen Ergebnissen.

Ich hatte bislang (also bis Delphi XE6 bzw. Kombination aktuelle Delphis + DLL <= XE6) in der Verwendung VCL-APP zu FMX-DLL keine komischen Ergebnisse, sondern nur funktionierende Programme. Außerdem möchte ich noch mal festhalten, dass es "nur" um das Entladen der DLL geht. Aufruf der DLL, Übergabe und Rückgabe von Daten funktioniert alles ordnungsgemäß.

Habe grade mal eine FMX-DLL erstellt, die nur eine Procedure "ShowAForm" exportiert (also ohne Parameter). Ihre einzige Aufgabe ist dann, wenn aufgerufen, eine leere FMX-Form anzuzeigen.

Also NULL Thema von wegen falscher Datenübergabe oder so. Und siehe da: Bei Freelibrary hängt das Programm.

Wer das immer noch nicht glauben mag: Ich habe diese Demo (XE8-Version) hier mal angehängt (Zuerst FMXFilters.dpr kompilieren = die FMX-DLL) und dann die MyDLLDemo.dpr kompilieren (= die VCL-App).

Wer hier etwas findet, das programmtechnisch falsch ist, ich lasse mich gerne eines Besseren belehren... aber momentan sieht das für mich nach einem BUG aus.

Bernhard Geyer 9. Mai 2015 16:08

AW: Der XE8 Fehler-Thread
 
Zitat:

Zitat von Harry Stahl (Beitrag 1300836)
Zitat:

Zitat von Sir Rufo (Beitrag 1300822)
Auch wenn die beiden Klassen aus der gleichen Unit stammen, sind die Klassen in der EXE und DLL anders und du darfst die nicht einfach so übergeben.

Inwiefern sind die Klassen anders? Also z.B. hier der TMemoryStream?

Probier doch einfach mal mit is bzw. as zu arbeiten.
Dann bekommst du den hier schon gefühlt Tausend mal gemeldeten Fehler

"Im Projekt Test.exe ist eine Exception der Klasse EConvertError mit der Meldung 'TPngImage kann nicht zu TPicture zugewiesen werden' aufgetreten."

(Wobei die Klassennamen unterschiedlich sind). Dort wurde auch schon tausend mal erklärt wieso das Auftritt wenn man ohne Runtimepackages arbeitet und versucht Instanzen zwischen DLL und Exe auszutauschen.


Zitat:

Zitat von Harry Stahl (Beitrag 1300836)
Zitat:

Zitat von Sir Rufo (Beitrag 1300822)
Alles andere führt zu komischen Ergebnissen.

Ich hatte bislang (also bis Delphi XE6 bzw. Kombination aktuelle Delphis + DLL <= XE6) in der Verwendung VCL-APP zu FMX-DLL keine komischen Ergebnisse, sondern nur funktionierende Programme.

War mehr oder mindern Zufall. Wir hatten auch vor Jahren so eine DLL-Konstrukt im Einsatz. Und hatten "funktionierende" Programme die halt ab und zu sich komisch verhalten haben.
Als wir das DLL-Konstrukt raus geschmissen hatten verschwanden auch dieses "komische Verhalten" von der wir nicht genau zuordnen konnten woher es kommt.

Zitat:

Zitat von Harry Stahl (Beitrag 1300836)
Habe grade mal eine FMX-DLL erstellt, die nur eine Procedure "ShowAForm" exportiert (also ohne Parameter). Ihre einzige Aufgabe ist dann, wenn aufgerufen, eine leere FMX-Form anzuzeigen.

Also NULL Thema von wegen falscher Datenübergabe oder so. Und siehe da: Bei Freelibrary hängt das Programm.

Wer das immer noch nicht glauben mag: Ich habe diese Demo (XE8-Version) hier mal angehängt (Zuerst FMXFilters.dpr kompilieren = die FMX-DLL) und dann die MyDLLDemo.dpr kompilieren (= die VCL-App).

Wer hier etwas findet, das programmtechnisch falsch ist, ich lasse mich gerne eines Besseren belehren... aber momentan sieht das für mich nach einem BUG aus.

Das könnte auf das Thema "niemals VCL und FMX in einem Programm verwenden" hinauslaufen. Wenn das aber in Exe/DLL ohne Runtimepackages verpackt ist sollte es trotzdem funktionieren.
DAS würde ich auch als Fehler ansehen.

Uwe Raabe 9. Mai 2015 16:24

AW: Der XE8 Fehler-Thread
 
Zitat:

Zitat von Harry Stahl (Beitrag 1300836)
Und siehe da: Bei Freelibrary hängt das Programm.

Könnte auch der hier sein: FMX Forms inside a DLL or BPL cause Access Violation when FreeLibrary is called or crash

Komisch, daß das wohl gerade bei XE6 nicht auftritt.

Harry Stahl 9. Mai 2015 16:38

AW: Der XE8 Fehler-Thread
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1300841)
Könnte auch der hier sein: FMX Forms inside a DLL or BPL cause Access Violation when FreeLibrary is called or crash

Komisch, daß das wohl gerade bei XE6 nicht auftritt.

Ja, das ist ja so ziemlich der identische Sachverhalt.

mensch72 9. Mai 2015 17:38

AW: Der XE8 Fehler-Thread
 
Das Beispiel mit der "Procedure ShowAForm" sollte so gehen, weil es eben doch nur ein simpler Call ohne Parameter Übergabe/Rückgabe ist.

Wir arbeiten weil oft auch von C/C++ kommend und eine alte Hauptapplikationen noch in D7 recht viel mit XE2..XE8 DLL's für aktuelle Erweiterungen.

Aber wir arbeiten da strikt nach dem Prinzip: Aufruf einer XE? DLL wie aus einer Fremdsprache/Fremdanwendung.
Der einzige manchmal nötige Trick ist eigentlich, in einer DLL TApplication teilweise selbst etwas weiter zu initialisieren, damit eine DLL beim FormCreate was sinnvolles zum übergeben hat.

- nur Funktionen und keine Procedures, also immer mit einem UINT32/INT32 als Rückgabe
- Funktionen ohne weiter Übergabeparameter erlaubt
- Objekte/Klassen als Übergabeparameter sind nicht erlaubt
- DelphiBoolean als direkter Übergabeparameter ist nicht erlaubt, wir verwenden UINT32 und es gilt C konform UINT32=0 für "False" und UINT32<>0 für "True" (meist "1")
- Bei Übergabe Parametern verwenden wir nur Standardtypen klar definierter Größe INT32,UINT32,INT64,UINT64,double,PAnsiChar,PWideCh ar,PBytes,PWord,PDWord,PQWord,(P)PackedRecords
- um den Stack nicht mit großen Records auf zu blähen, über geben wir bei alles was größer wie 8Bytes als Pointer
- Das aufrufende Programm stellt stets den Speicher zur Verfügung, oder in Ausnahmefällen die DLL allokiert den Speicher mit Nativ-Funktionen der WinAPI, damit das Aufrufende Programm diesen auch wieder per Nativ-Funktionen der WinAPI freigeben kann
- Für DLL Funktionen mit "Textparametern" halten wir uns an das WinAPI-Schema, es gibt getrennte Funktionen(A&W) für NonUnicode und UniCode, welche mit PAnsiChar oder PWideChar arbeiten und zusätzlich immer einen Parameter der max. Größe, damit auch die Rückgabe sicher begrenzt werden kann
- Records in den Übergabeparametern werden möglichst per Pointer übergeben und haben eine fixe Größe sowie sind stets als "Packed Record" definiert
- Arrays werden als Pointer mit separatem Längenparameter übergeben

Aus Prinzip sind das sogar noch nach ganz alten Regeln für Win32API C Anwendungen, aber unter Beachtung dieser Regeln funktionieren aktuelle VCL und FMX Dlls aus XE2..XE8 eigentlich in jedem Programm und in jeder Programmiersprache, wo externe DLL's aufgerufen werden können.
Der Kontrolltest mit XE? DLL Aufruf aus einem D7 oder C Programm zum Test hat sich bewährt, den da fällt ganz schnell auf, ob absichtlich oder unabsichtlich doch etwas Delphi spezifisches übergeben wurde.

jaenicke 9. Mai 2015 17:57

AW: Der XE8 Fehler-Thread
 
Ich habe gerade getestet:
Es liegt weder am Entladen der DLL beim Programmende noch an der Klasse als Parameter. Der Fehler tritt auch auf, wenn eine Prozedur ganz ohne Parameter aufgerufen wird, die ein Formular anzeigt, und wenn die DLL direkt nach dem Aufruf wieder entladen wird.

Ich habe das auch per Kommentar in dem Ticket ergänzt.

Ein flüchtiger Blick in den Stacktrace zeigt, dass dort ein paar Threads mit WaitForSingleObject warten, die offenbar aus DirectX Funktionen kommen.

himitsu 10. Mai 2015 22:59

AW: Der XE8 Fehler-Thread
 
Kann man erwarten, daß irgendwann das Codefolding richtig funktioniert?

In Verbindng mit
Delphi-Quellcode:
{$LEGACYIFEND ON}
und
Delphi-Quellcode:
{$IF ...}
hab ich jetzt den Fall, daß nach mehreren Verschachtelungen das Folding voll abdreht.
Genauer faltet es das
Delphi-Quellcode:
{$IF xxx}
bis zum
Delphi-Quellcode:
{$ENDREGION}
zusammen und schreibt [intern] hin und das obwohl IFs sonst nicht gefaltet werden.
Zwei/Drei Mal geht es und dann plötzlich nicht mehr.
Delphi-Quellcode:
  {$IF UseFeigCOM}

  TFeigCom = class(TFeigPort)
  {$REGION 'intern'}
  private
    ...
  {$ENDREGION}
  public
    ...
  published
    ...
  end;

  {$IFEND}
Auch schafft das Folding es immernoch nicht, einen \\\Doc-Kommentar oder eine Region vor dem
Delphi-Quellcode:
unit xxx;
zusammenzufalten.

Mit
Delphi-Quellcode:
const myconst = {$IFDEF xxx}true{$ELSE}false{$ENDIF};
und manchmal auch
Delphi-Quellcode:
{$IFDEF xxx}Winapi.{$ENDIF}Windows.Beep;
kommt fast keiner klar. (der Compiler ja, aber weder Help Insight, noch Error Insight und externe Dinge, wie CodeParser, Refactoring, CodeFormating und Documentation Insight sowieso nie)



Wenn sich komische Zeichen (meistens vermutlich Linux-Zeilenumbrüche oder unsichtbare Steuerzeichen) in den Quellcode schleichen, dann verruscht immernoch das Folding und die Debuggerzeilenzählung.

Sir Rufo 12. Mai 2015 14:18

AW: Der XE8 Fehler-Thread
 
Liste der Anhänge anzeigen (Anzahl: 1)
Noch ein Fehlerchen in Verbindung mit dem iOS-Simulator
Delphi-Quellcode:
unit Form.Main;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,
  FMX.Controls.Presentation;

type
  TForm1 = class(TForm)
    ToolBar1: TToolBar;
    toggleStatusBarButton: TSpeedButton;
    procedure toggleStatusBarButtonClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.toggleStatusBarButtonClick(Sender: TObject);
begin
  if Self.BorderStyle = TFmxFormBorderStyle.None then
    Self.BorderStyle := TFmxFormBorderStyle.Sizeable
  else
    Self.BorderStyle := TFmxFormBorderStyle.None;
end;

end.
Ein paar mal auf dem Button gesteppt und wenn man Glück hat kommt nur das hier
Anhang 43158
oder die App stürzt einfach sang und klanglos ab.

Nachtrag:

Unter Android geht das nur, wenn man das in dem originalen UIThread ausführt:
Delphi-Quellcode:
uses
  FMX.Helpers.Android;

procedure TForm1.toggleStatusBarButtonClick( Sender: TObject );
begin
  CallInUIThread(
    procedure
    begin
      if Self.BorderStyle = TFmxFormBorderStyle.None then
        Self.BorderStyle := TFmxFormBorderStyle.Sizeable
      else
        Self.BorderStyle := TFmxFormBorderStyle.None;
    end );
end;
stürzt dort aber genauso ab - ok, gefühlt häufiger (getestet auf einem echten Device)

Union 12. Mai 2015 14:22

AW: Der XE8 Fehler-Thread
 
Zu den Problemen gibt es im QC 27 offene Reports.

Sir Rufo 12. Mai 2015 14:30

AW: Der XE8 Fehler-Thread
 
Zitat:

Zitat von Union (Beitrag 1301212)
Zu den Problemen gibt es im QC 27 offene Reports.

Auf die Schnelle habe ich da keinen gefunden der dazu passt ... anyway am Besten die StatusBar eingeblendet lassen und den BoderStyle niemals anfassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:29 Uhr.
Seite 20 von 25   « Erste     10181920 2122     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz