Einzelnen Beitrag anzeigen

Emwykey

Registriert seit: 27. Aug 2013
51 Beiträge
 
#1

asignRKCOM DLL

  Alt 17. Mär 2017, 14:55
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!
  Mit Zitat antworten Zitat