Neues Thema starten

Zugriff auf die DLL

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;


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.


Anmelden oder Registrieren um einen Kommentar zu veröffentlichen