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;  // zu sendener Frame
  DWORD dwResult;    // ErrorCode
  if(bState)
  {
    //... code raus genommen
  }
  else
  {
    //... noch was anderes
  }
  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;
stdcallexternal '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;
stdcallexternal '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


C#-Quelltext
1:
typedef bool  MYBOOL;                    


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;
stdcallexternal 'BDD6.dll';


in

Delphi-Quelltext
1:
2:
function LogicalVersN (SetOn: Longword): Longword;
cdeclexternal '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

user profile iconTimbo hat folgendes geschrieben Zum zitierten Posting springen:

C#-Quelltext
1:
typedef bool  MYBOOL;                    

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: