Autor |
Beitrag |
Timbo
      
Beiträge: 166
|
Verfasst: Mi 19.01.11 12:51
Hallo zusammen,
ich versuche eine DLL in Delphi einzubinden, doch leider schließt sich bei meinen bisherigen Versuchen das Programm komplett, ohne Fehlermeldung.
Leider habe ich in C nicht so viel Erfahrung, habe aber den Quellcode der DLL.
Also in der HeaderDatei steht:
C#-Quelltext 1: 2: 3: 4: 5:
| #if _USRDLL MYDWORD __declspec(dllexport)LogicalVersN(MYBOOL); #else MYDWORD __declspec(dllimport)LogicalVersN(MYBOOL); #endif |
in der CPP Datei:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| DWORD CBDD6App::Dll_LogicalVersN(BOOL bState) { CString strToSend; DWORD dwResult; if(bState) { } else { } return dwResult; }
extern "C" MYDWORD LogicalVersN(MYBOOL bState) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return theApp.Dll_LogicalVersN(bState); } |
Ich hab versucht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| function LogicalVersN (SetOn: Boolean): Longword; stdcall; external 'BDD6.dll';
function MyLogicalVersN(SetOn: Boolean): Integer; begin result:= LogicalVersN(SetOn); end; |
Auch das führt leider zum selben Ergebnis:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| function LogicalVersN (SetOn: Longword): Longword; stdcall; external 'BDD6.dll';
function MyLogicalVersN(SetOn: Longword): Integer; begin if SetOn then result:= LogicalVersN(1) else result:= LogicalVersN(0); end; |
Was mache ich falsch?
Vielen vielen Dank schon mal.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 19.01.11 15:47
Wie ist MYBOOL definiert?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Timbo 
      
Beiträge: 166
|
Verfasst: Mi 19.01.11 15:58
C#-Quelltext
Ist es das?
Bin hier echt am verzweifeln, irgendwo knallt es da mächtig...
|
|
Timbo 
      
Beiträge: 166
|
Verfasst: Mi 19.01.11 16:48
ich habe jetzt
Delphi-Quelltext 1: 2:
| function LogicalVersN (SetOn: Longword): Longword; stdcall; external 'BDD6.dll'; |
in
Delphi-Quelltext 1: 2:
| function LogicalVersN (SetOn: Longword): Longword; cdecl; external 'BDD6.dll'; |
geändert, nun geht es, kann es das gewesen sein???
|
|
GuaAck
      
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Mi 19.01.11 17:01
Hallo,
Bei Functions werden die Parameter über den Stack übergeben. Da gibt es Unterschiede, z. B. in der Reihenfolge der Parameter.
Bei Dir ist aber wichtig, das bei cdecl der Aufrufer den Stack (auf dem er ja auch die Parameter abgelegt hat) wieder aufräumt, bei stdcall wird das von der aufgerufen Routine erwartet. Mit stdcall statt cdecl war also Dein Stck nach dem Aufruf durcheinander und Dein Programmm hat immer auf andere Variablen zugegriffen, als es "dachte" und schließlich auch den Rücksprung zu seinem Aufrufer nicht mehr gefunden. Hätte eigentlich eine Exception geben müssen.
Gruß GuaAck
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 19.01.11 17:03
Dann probier mal LongBool als Parameter. Das entspricht eher REM Verhalten der C-Deklaration.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 19.01.11 17:42
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 19.01.11 20:57
Naja, wenn man schon den Quelltext offenlegen muss, dann kann man ihn zumindest so schreiben, dass jemand anderes ihn nicht so einfach versteht... 
|
|
|