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


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

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


Die C++ Redistributable Packages sind bei mir installiert. Da ich die Fehlermeldung erhalte "ungültige Parameter", gehe ich davon aus, dass bei meiner Parameterübergabe an die Funktion was falsch ist.


Wie sieht bei die Definition der Funktion "worm_transaction_start" aus und wie rufst du diese aus deinem Delphi Code heraus auf?

DLL Funktion

 function worm_transaction_start(context: PWormContext; const clientId: PAnsiChar; const processData: PAnsiChar; processDataLength: worm_uint; const processType: PAnsiChar; response: PWormTransactionResponse): WormError; stdcall;
  external LIBWORMAPI name _PU + 'worm_transaction_start';


Funktionsaufruf aus meinem Interface:
Error := worm_transaction_start(Context, PAnsiChar(Utf8String(CLIENT_ID)), PAnsiChar(Utf8String(Data)), Length(Data), PAnsiChar(Utf8String('Buchung')), Response.Ptr);


Datentypen:

Context : IntPtr
worm_uint: UInt64
WormTransactionResponse: IntPtr


Ich verwende in den anderen DLL Funktionen ebenfalls diese Typen und dort funktioniert es.

ich benutze  den Aufruf "cdecl" statt "stdcal"

 hab's eben bei mir umgestellt - funktioniert auch nicht. welche version des TSE API verwendet du?


könntest du mir allenfalls noch zeigen wie du bei dir die funktion aus deinem code heraus aufrufst (just in case)?

Anmelden oder Registrieren um einen Kommentar zu veröffentlichen