Hallo zusammen!
ich habe ein Problem bei der Verwendung von Funktionen aus der
DLL der im Titel genannten Bibliothek.
Es handelt sich um eine C/C++
Dll.
Ich habe einige Funktionen bereits in mein Delphi Projekt (Delphi XE 5 Embarcadero
RAD Studio) eingebunden, welche auch problemlos aufzurufen sind.
Hier ein Beispiel:
Funktionsaufruf lt. Schnittstellenbeschreibung:
Code:
long Certificate( void*
handle , char* buffer , long * buffersize ) ;
Zitat:
Paramter:
handle:
Handle welches von Initialize zurückgeliefert wurde (siehe 4.2.2)
buffer: Bereits reservierter Speicher für die Zertifkat, wenn dieser Parameter NULL
ist wird nur die Gröÿe des benötigten Speichers zurückgegeben
buffersize: Speichergröße von buffer bzw. benötigte Speichergröÿe
Rückgabewert:
0: OK
100: Buffer ist NULL
101: Buffer zu klein
Ich habe das ganze wie folgt umgesetzt:
Code:
type
THandle_PAnsiChar_PAnsiChar__Integer = function( aHandle : THandle; Buffer : PAnsiChar; BufferSize : PAnsiChar ) : Integer; cdecl;
[...]
var
fCertificate : THandle_PAnsiChar_PAnsiChar__Integer;
[...]
implementation
procedure TForm1.FormShow(Sender: TObject);
var IntLaenge : PAnsiChar;
begin
hDll := LoadLibrary('asignRKCom.dll');
if HDll >= 32 then begin
fCertificate := GetProcAddress(hDll, 'Certificate');
[...]
bufferCertificate := nil; // PAnsiChar
IntLaenge := PAnsiChar(AllocMem(1)); // PAnsiChar
fCertificate( aHandle, bufferCertificate, IntLaenge ); // dieser Aufruf liefert die benötigte Speichergröße
bufferCertificate := PAnsiChar(AllocMem(Integer(IntLaenge^)));
case fCertificate( aHandle, bufferCertificate, IntLaenge ) of // dieser Aufruf schreibt den gewünschten Wert in meinen Buffer
0 : begin //OK
//showmessage( 'Certificate Serial: OK' );
end;
100 : begin // Buffer ist NULL
//showmessage( 'Certificate Serial: Buffer ist NULL' );
end;
101 : begin // Buffer zu klein
//showmessage( 'CertificateSerial: Buffer zu klein' );
end;
end;
[...]
end else
MessageDlg('Error: could not find asignRKCom.dll', mtError, [mbOk], 0);
end;
Hier funktioniert alles. Genauso wie in vielen Weitern genau so definierten Funktionen.
Die Funktion "fGenerateKey" habe ich identisch behandelt (natürlich auf die neuen Übergabeparameter angepasst).
Hier bekomme ich beim Aufruf eine Zugriffsverletzung.
Nachdem ich den Längenwert von PAnsiChar in Typ Pointer ( @LongInt ) angepasst hatte bekam ich keine Fehlermeldung mehr, die Methode lieferte jedoch beim 2. Auftruf nicht den gewünschten Wert in "Buffer" zurück. Buffer blieb leer.
Der Rückgabewert der Funktion lautete 0 für OK.
Ich habe bereits viele Varianten versucht. Übergabewerte vom Typ Pointer, PChar und PLongInt, PAnsiChar und PLongInt, PAnsiString und PLongInt, oder auch AnsiString und Integer/LongInt ...
Des Weiteren stieß ich auf folgenden LInk
http://www.coding-board.de/threads/c...rwenden.20639/ --> Hier wird beschrieben, dass es sein kann, dass die Übergabeparameter in umgekehrter Reihenfolge übergeben werden, also habe ich die o.g. Varianten alle Rückwärts ebenfalls versucht.
Leider erfolglos
Die Funktion ist lt. Schnittstellenbeschreibung wie folgt definiert:
Code:
long GenerateKey ( char* newkey , long *newkeyLen ) ;
Zitat:
Paramter:
newkey: Bereits reservierter Speicher für den AES Schlüssel, wenn dieser Parameter
NULL ist wird nur die Größe des benötigten Speichers zurückgegeben
newkeyLen: Länge des AES Schlüssel bzw. benötigte Speichergröÿe
Rückgabewert:
0: OK
1: Fehler
102: newkeyLen zu klein
Hat hier jemand Erfahrungen mit C/C++
Dll s in Delphi? Oder noch besser mit der verwendeten Bibliothek?
Woran könnte es liegen, dass der Aufruf schreitert?
Was könnte ich noch versuchen?
Danke!