hab noch die cdecl dll in my debug verzeichnis kopiert (anstatt die stdcal version) - und jetzt funktioniert es :-)
danke für die hilfe.
Hat jemand einen funktionierenden Zugriff auf die worm_init?
Ich bekomme ständig in Delphi 5 eine Zugriffsverletzung.
Delphi 5 ist doch schon etwas in die Jahre geraten. Ich verwende Rad Studio Rio (10.3).
Bei mir sieht der Aufruf in meinem TSE Interface so aus:
function TSwissbitAccess.Connect(Drive : String) : Boolean; var Error : WormError; begin Result := False; Error := worm_init(Context, PUTF8Char(UTF8String(Drive))); if Error = WORM_ERROR_NOERROR then begin FDrive := Drive; WormInfo := TWormInfo.Create(Context); Result := True; end else begin WormInfo := nil; end; end;
und im DLL wrapper so:
function worm_init(out context: PWormContext; const mountPoint: PUTF8Char): WormError; cdecl; external LIBWORMAPI name _PU + 'worm_init';
und hier noch die Definition von PWormContext:
PWormContext = IntPtr;
Also irgendwo habe ich einen Denkfehler, sobald ich die Zeile
Error := worm_info_read(pInfo);
aktiviere bekomme ich einen Zugriffsfehler. Aber Warum?
Vielleicht hat ja jemand eine Idee.
unit TSE_Test_Main;
{$mode objfpc}{$H+}
interface
uses
Windows, Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ComCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Memo1 : TMemo;
StatusBar1 : TStatusBar;
procedure FormCreate(Sender: TObject);
private
public
end;
type
Tworm_getVersion = function: PAnsiChar; stdcall;
Tworm_signatureAlgorithm = function: PAnsiChar; stdcall;
Tworm_logTimeFormat = function: PAnsiChar; stdcall;
var
Form1 : TForm1;
worm_getVersion : Tworm_getVersion;
worm_signatureAlgorithm : Tworm_signatureAlgorithm;
worm_logTimeFormat : Tworm_logTimeFormat;
const
LIBWORMAPI = 'E:\EC-Entwicklung\EC-10\TSE\windows32-stdcall\WormAPI.dll';
_PU = '';
function worm_init(out Context: IntPtr; const mountPoint: PAnsiChar): WORD; stdcall;
external LIBWORMAPI name _PU + 'worm_init';
function worm_info_new(Context: IntPtr): WORD; stdcall;
external LIBWORMAPI name _PU + 'worm_info_new';
function worm_info_read(Info: IntPtr): WORD; stdcall;
external LIBWORMAPI name _PU + 'worm_info_read';
procedure worm_info_tseSerialNumber(info: IntPtr; serialNumber: PByteArray; serialNumberLength: Integer); stdcall;
external LIBWORMAPI name _PU + 'worm_info_tseSerialNumber';
implementation
{$R *.lfm}
var
DLLHandle: THandle;
Error : WORD; //WormError;
Drive : String;
procedure TForm1.FormCreate(Sender: TObject);
var
v, s : String;
i : integer;
Wert, Ergebnis : Boolean;
function InitSwissbitDll : Boolean;
begin
if DLLHandle <> 0 then exit;
DLLHandle := LoadLibrary(LIBWORMAPI);
Result := DLLHandle <> 0;
pointer(worm_getVersion) := GetProcAddress(DLLHandle, 'worm_getVersion');
pointer(worm_signatureAlgorithm) := GetProcAddress(DLLHandle, 'worm_signatureAlgorithm');
pointer(worm_logTimeFormat) := GetProcAddress(DLLHandle, 'worm_logTimeFormat');
end;
function Connect(Drive : String) : Boolean;
var
Context, pInfo : IntPtr;
begin
Result := False;
Error := worm_init(Context, PAnsiChar(UTF8String(Drive)));
if Error = 0 then //WORM_ERROR_NOERROR
begin
ShowMessage('Fehler = 0');
pInfo := worm_info_new(Context);
// Error := worm_info_read(pInfo);
Result := True;
end
else
begin
end;
end;
begin
ShowMessage('Dies ist ein Test');
Drive := 'I:';
Wert := InitSwissbitDll;
if Wert = True then
begin
Ergebnis := Connect(Drive);
Form1.Memo1.Text := worm_getVersion() + #13#10 + worm_signatureAlgorithm() + #13#10 + worm_logTimeFormat() + #13#10 + 'Fehler: ' + IntToStr(Error);
Form1.StatusBar1.Panels[1].Text := 'DLL erfolgreich geladen';
end
else
begin
Form1.StatusBar1.Panels[1].Text := 'Fehler! DLL nicht entladen';
end;
end;
begin
end.
Während meiner Integartion hatte ich auch Probleme mit dem Schreiben einer Transaktion (bekam immer den Fehler "Invalid Parameters"). Das Problem konnte ich schlussendlich lösen, indem ich ein meinem DLL Interface die Funktionsdeklarantionen von "stdcall" auf "cdecl" umgestellt hatte (vergiss nicht ebenfalls die entsprechende DLL von Swissbit zu verwenden - nicht die stdcall).
Bekomme ich weiterhin den gleichen Fehler. Sobald ich mit worm_info_read etwas auslesen will.
Also was ich festgestellt habe ist, dass die Funktion
worm_info_read(pInfo);
mit dem Wert pInfo irgendwie nichts anfangen kann.
Aber Warum?
Wenn ich das Ganze debugge, bekomme ich bei pInfo den Wert 23944.
Hi allerseits,
falls das nach 1x Jahr noch jemanden interessiert:
ich fange auch erst mit der TSE-Umsetzung an. Das o.g. Hyroglyphen-Problem hatte ich zunächst auch - lässt sich aber ab Delphi-7 über den Rückgabetyp PANSIChar statt PChar in der Deklaration beheben.
etwa z.B.:
function worm_getVersion : PANSIChar; stdcall; external 'WormAPI.dll';
function worm_signatureAlgorithm: PANSIChar; stdcall; external 'WormAPI.dll';
Ich arbeite mit Delph 10 (Berlin) - damit funktioniert es jedenfalls.
Jürgen Bukoitz
Hallo,
da ich doch erst mal "klein" anfangen muss und meine sdcard noch nicht da
ist versuche ich dll Version auszulesen. Der untere Code gibt mir aber
nur Hieroglyphen zurück, es scheint was mit der typ Umwandlung nicht zu stimmen. Sieht einer den Fehler?
private
{ Private-Deklarationen }
procedure dllLaden;
procedure dllEntladen;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
function worm_getVersion : PChar; stdcall; external 'WormAPI.dll';
implementation
{$R *.dfm}
var
hDLL : HMODULE;
procedure TForm1.dllLaden;
var
v,
s : String;
i : integer;
begin
hDLL := LoadLibrary('WormAPI.dll');
if hDLL <> 0 then //DLL erfgolgreich geladen?
begin //Wenn 0 dann laden fehlgeschlagen!
v := String(worm_getVersion);
Memo1.Text := v;
Form1.StatusBar1.Panels[1].Text := 'DLL erfolgreich geladen';
end
else
begin
s := SysErrorMessage(GetLastError());
ShowMessage('DLL fehlgeschlagen!' + s);
Form1.StatusBar1.Panels[1].Text := 'Fehler! DLL nicht geladen';
end;
end;
procedure TForm1.DLLEntladen;
begin
if hDLL <> 0 then
begin
FreeLibrary(hDLL);
hDLL := 0;
Form1.StatusBar1.Panels[1].Text := 'DLL entladen';
end
else
begin
Form1.StatusBar1.Panels[1].Text := 'Fehler! DLL nicht entladen';
end;
end;