AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

asignRKCOM DLL

Ein Thema von Emwykey · begonnen am 17. Mär 2017 · letzter Beitrag vom 19. Apr 2017
Antwort Antwort
Emwykey

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

asignRKCOM DLL

  Alt 17. Mär 2017, 15: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
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#2

AW: asignRKCOM DLL

  Alt 17. Mär 2017, 16:20
Hmm..

Wieso nimmst Du ein PAnsiChar bei long?

Delphi-Quellcode:
type
  TCertificateFunc = function (Handle : THandle; Buffer : PAnsiChar;var BufferSize : DWORD):DWORD;stdCall;

var
  FCertificate : TCertificateFunc;
Hier bitte die Aufrufkonvention anpassen (register/cdecl/stdcall).
  Mit Zitat antworten Zitat
Emwykey

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

AW: asignRKCOM DLL

  Alt 17. Mär 2017, 16:31
Ich habe einige Datentypen versucht und bin da hängen geblieben. Ich hatte auch bei der Certificate Funktion nicht von Anfang an gleich einen funktionierenden Aufruf zusammen. ich hab aber wie erwähnt auch schon PLongInt verwendet (bei GenerateKey) und leider dasselbe Ergebnis erhalten. Bei Certificate funktioniert ja alles...
  Mit Zitat antworten Zitat
Emwykey

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

AW: asignRKCOM DLL

  Alt 17. Mär 2017, 16:36
ABER! Der Hinweis hat das Problem gelöst!!!
VIELEN VIELEN DANK!!!!!!!!!!
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#5

AW: asignRKCOM DLL

  Alt 19. Apr 2017, 14:48
ah noch jemand der dort dran ist.
Ich verzweifle hier auch gerade ein wenig.

Was ich den ganzen Funktionen nachher mitgeben muss weiß ich auch noch nicht


Österreicher ich hab euch gern ... ganz ehrlich

Geändert von stalkingwolf (19. Apr 2017 um 14:56 Uhr) Grund: fixed
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: asignRKCOM DLL

  Alt 19. Apr 2017, 15:29
Alles vom Grunde auf selber programmieren ist ja auch Horror. Wir nutzen dafür die Lösung von fiskaltrust. Wäre das für euch eine Option?
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#7

AW: asignRKCOM DLL

  Alt 19. Apr 2017, 16:06
Nuna ja ich muss eh ein Server Programm schreiben und die Clientimplementierung in unsere Kassen inkl Ausdruck des QR Codes auf unsere Belege.
die a.sign DLL nimmt einem schon sehr viel Arbeit ab. Ich muss mich nun nur durchfuchsen was ich benötige.
Datenaufbau habe ich mittlerweile auch raus.

Interessanter finde ich die diversen Beiträge im Netz das die Startbelege nicht vom Finanzamt in Österreich erkannt werden, obwohl alle Prüftools sie als ok zurückgeben.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: asignRKCOM DLL

  Alt 19. Apr 2017, 16:17
Na ja, der fehlerlose Aufbau des DEP ist ja auch nicht ohne.

Mit der fiskaltrust-Lösung haste einen lokalen Windows-Dienst als Webservice, der mit der Karte redet und das DEP führt.
WSDL importieren. Interface mit drei Methoden verwenden. Datencontainer mit den wichtigsten Sachen füllen. Fertig.
  Mit Zitat antworten Zitat
stalkingwolf

Registriert seit: 6. Mai 2011
540 Beiträge
 
#9

AW: asignRKCOM DLL

  Alt 19. Apr 2017, 16:22
Für das DEP werden wir den e-Tresor von A-Trust einsetzen.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz