![]() |
Aufrufparameter für C-Funktionen in DLL's
Moin moin,
aus einer DLL möchte ich diverse C-Funktionen aufrufen. Das funktioniert aber leider nur zum Teil.
Delphi-Quellcode:
Das Problem tritt beim Aufruf von pGetErrorMsg auf. Ich erhalte eine Zugriffsverletzung beim Lesen auf einem Speicherbereich. Hier die Definitionen dieser C-Funktionen:
TOpenSession = function (strArgs: pchar; lngSession: pointer): longint; stdcall;
TGetErrorMsg = function (lngSession: longint; lngResult: longint; strLanguage, strMessage: PChar; lngMessageLength: int64): longint; stdcall; TGetLicense = function (lngSession: longint; strLanguage : pchar; lngLength : pointer) : longint; stdcall; procedure TForm1.Button1Click(Sender: TObject); var DLLHandle : THandle; pOpenSession : TOpenSession; pGetErrorMsg : TGetErrorMsg; pGetLicense : TGetLicense; lngLength, lngResultCode, lngSession, lngRetCode, i : longint; arChar, arChar1 : Array [1..255] of char; begin DLLHandle := LoadLibrary (PAnsiChar ('blablubb.dll')); @pOpenSession := GetProcAddress (DLLHandle, 'open_session'); @pGetErrorMsg := GetProcAddress (DLLHandle, 'get_error_msg'); @pGetLicense := GetProcAddress (DLLHandle, 'get_license'); lngResultCode := pOpenSession ( pchar ('service=''blabla'', servicehost=''localhost'''), @lngSession); fillchar (archar1, 2, 0); arChar1[1] := 'D'; FillChar (arChar, 255, 0); lngLength := 254; lngResultCode := pGetLicense (lngSession, @arChar, @lngLength); FillChar (arChar, 255, 0); lngResultCode := pGetErrorMsg (lngSession, 11, @archar1, @arChar, 255); end;
Code:
In einem mitgeliefertem Demo-Programm wird get_error_msg wie folgt aufgerufen:
long open_session (const char * args, long * session);
long get_license (long session, char * license, unsigned int * length); long get_error_msg (long session, long result, const char * lang, char * buf, size_t len);
Code:
Wie muß nun der korrekte Delphi-Aufruf dieser Funktion aussehen?
static char language[64] = "D";
long session; long rc; char msg[80]; urc = get_error_msg(session, rc, language, &msg[0], sizeof msg); PS: Ich hoffe, ich habe alle wesentlichen Programmzeilen aus den Beispielen übernommen... |
Re: Aufrufparameter für C-Funktionen in DLL's
Delphi-Quellcode:
function open_session(args: PChar; session: PLongint): Longint; (*"stdcall;" oder "cdelcl;"*)
function get_license (session: Longint; license: PChar; length: PUINT): Longint; (*"stdcall;" oder "cdelcl;"*) function get_error_msg (session, res: Longint; lang, buf: PChar; len: UINT): Longint; (*"stdcall;" oder "cdelcl;"*) // result -> res // Result kann nicht nochmal definiert werden in einer Funktion und muss deshalb umbenannt werden. --- var session, rc, Res: Longint; msg: array[0..79] of Char; language: array[0..63] of Char; begin ZeroMemory(@msg, sizeof(msg)); ZeroMemory(@language, sizeof(language)); language[0] := 'D'; Res := get_error_msg(session, rc, language, msg, sizeof(msg)); |
Re: Aufrufparameter für C-Funktionen in DLL's
Zitat:
|
Re: Aufrufparameter für C-Funktionen in DLL's
Moin Stefan,
das behebt den Fehler leider nicht. :cry: |
Re: Aufrufparameter für C-Funktionen in DLL's
Zitat:
"size_t" ist vier Byte groß, "int64" ist acht Byte groß. Besser ist "UINT"/ "Cardinal"/ "DWORD". |
Re: Aufrufparameter für C-Funktionen in DLL's
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:40 Uhr. |
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