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;


Unter Delphi 5 läuft alles einwandfrei.

Unter Delphi XE4 bekomme ich immer  dieses Ergebnis


⸵3捥獤ⵡ汰楡⵮䡓㍁㐸


hat keiner einer Idee?


Da steht doch "DLL erfolgreich geladen" oder kannst du kein chinesisch?  :-) :-)


Ich habe die Vermutung du lädst hier zuvor irgend einen asiatischen Sprachtreiber hoch. Kann es sein, dass vielleicht im Compiler irgendwo noch etwas mit asiatischen Schriften eingestellt ist?


Ich kenne mich mit XE4 nicht aus. Mein Programm ist in Delphi 5 programmiert und jetzt ich bin zu Lazarus gewechselt, da habe ich noch echtes Pascal im Hintergrund und kein .Net Framework.

Hallo Jürgen,


du scheinst hier dynamisches und statisches Laden zu vermischen. 

Wenn du die Funktion so deklarierst lädst du die DLL statisch und kannst dir somit das LoadLibrary sparen.

 

function worm_getVersion : PChar;  stdcall; external 'WormAPI.dll'; 

 Schau dir mal diese Seite an, vielleicht hilft das:

https://www.swissdelphicenter.ch/de/showcode.php?id=950


Ich binde die DLL dynamisch ein.

Hier die Deklaration als Beispiel: 

 

type
  TWorm_getVersion = function: PAnsiChar;stdcall;

var
  worm_getVersion: TWorm_getVersion;

implementation

const StdCallDLL = 'WormAPI.dll';
var DLLHandle: THandle;

function InitSwissbitDll: Boolean;
begin
  if DLLHandle <> 0 then exit(true);

  DLLHandle := LoadLibrary(StdCallDLL);
  Result := DLLHandle <> 0;
  @worm_getVersion := GetProcAddress(DLLHandle, 'worm_getVersion');
end;

 

Ich hoffe das hilft.

Dennis


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.


Hallo


die Funktion LoadLibrary Liefert auf manche Windowsrechnern (Windows 10 64 bit), die  0  zurück.


auch das Testprogramm von Swissbit zeigt die Meldung "das angegebene Modul 'WorAPI.dll' wurde nicht gefunden ", obwohl die Datei existiert.


weißt jemand, was auf diesen Rechner fehlt?




Tippfehler   WormAPI.dll

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).

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;

 

Hallo,


bei uns hat es geholfen, die Visual C++ Redistributable Packages zu installieren. 

Die findest du hier: 

https://support.microsoft.com/de-de/help/2977003/the-latest-supported-visual-c-downloads

unter dem Bereich "Visual Studio 2015, 2017 und 2019" und dann abhängig davon ob das Programm 32-bit und 64-bit hat.


Dennis

Hallo zusammen


Ich bin dara das TSE Modul in meine Delphi Anwendung zu entegrieren, habe aber Probleme  beim Aufruf der DLL Funktion "worm_transaction_start". Bekomme immer die Antwort "WORM_ERROR_INVALID_PARAMETER".


Wäre es möglich, dass mir jemand die Signatur von dieser Funktion geben könnte sowie einem Codefragment, aus welchem ich sehen wie die Funktion aus Delphi heraus aufgerufen werden muss (speziell die Parameter)?


Danke vielmals



bei uns hat es geholfen, die Visual C++ Redistributable Packages zu installieren


Vielen Dank

der DLL Funktion "worm_transaction_start"


versuche es damit


function worm_transaction_start(context:WormContext; clientId:PAnsiChar;
    processData:PAnsiChar; processDataLength:worm_uint;
    processType:PAnsiChar; response:WormTransactionResponse):WormError;


bei der

  WormContext = PInt32;

  WormError = WORD;

 WormTransactionResponse = PInt32;

worm_uint = UInt64


Anmelden oder Registrieren um einen Kommentar zu veröffentlichen