Entwickler-Ecke
Dateizugriff - DLL einbinden in Delphi (BOOL Problem)
Timbo - Mi 19.01.11 12:51
Titel: DLL einbinden in Delphi (BOOL Problem)
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 - Mi 19.01.11 15:47
Wie ist MYBOOL definiert?
Timbo - Mi 19.01.11 15:58
Ist es das?
Bin hier echt am verzweifeln, irgendwo knallt es da mächtig...
Timbo - 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 - 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 - Mi 19.01.11 17:03
Dann probier mal LongBool als Parameter. Das entspricht eher REM Verhalten der C-Deklaration.
Delete - Mi 19.01.11 17:42
Timbo hat folgendes geschrieben : |
|
Ist das eigentlich ein Grund für eine fristlose Kündigung? :wall:
jaenicke - 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... :lol: :nut:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!