Einzelnen Beitrag anzeigen

mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#195

AW: Der XE8 Fehler-Thread

  Alt 9. Mai 2015, 17:38
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.
  Mit Zitat antworten Zitat