Einzelnen Beitrag anzeigen

Benutzerbild von r_kerber
r_kerber

Registriert seit: 11. Feb 2003
Ort: Trittau
3.538 Beiträge
 
Delphi XE Professional
 
#1

Aufrufparameter für C-Funktionen in DLL's

  Alt 16. Mär 2007, 08:19
Moin moin,

aus einer DLL möchte ich diverse C-Funktionen aufrufen. Das funktioniert aber leider nur zum Teil.
Delphi-Quellcode:
  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;
Das Problem tritt beim Aufruf von pGetErrorMsg auf. Ich erhalte eine Zugriffsverletzung beim Lesen auf einem Speicherbereich. Hier die Definitionen dieser C-Funktionen:
Code:
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);
In einem mitgeliefertem Demo-Programm wird get_error_msg wie folgt aufgerufen:
Code:
static char  language[64] = "D";
long session;
long rc;
char msg[80];
urc = get_error_msg(session, rc, language, &msg[0], sizeof msg);
Wie muß nun der korrekte Delphi-Aufruf dieser Funktion aussehen?
PS: Ich hoffe, ich habe alle wesentlichen Programmzeilen aus den Beispielen übernommen...
  Mit Zitat antworten Zitat