![]() |
Problem mit dynamischem Laden von DLL mit Aufrufkonvention cdecl
Hallo zusammen,
mir wurde eine C-DLL zur Verfügung gestellt, die ich in meine Delphi-Anwendung einbinden muss. Ich habe es im ersten Schritt dynamisch versucht:
Delphi-Quellcode:
Anstatt der korrekten Seitenzahl 1 erhalte ich jedoch den Rückgabewert -899131968.
// Deklarationen
TpdfGetNumPages = function (pdf: Pointer): Integer; cdecl; pdfGetNumPages: TpdfGetNumPages; // Hilfsfunktion procedure LoadFunction(var Func: Pointer; const FuncName: AnsiString); begin if Func = nil then begin Func := GetProcAddress(FDLL_Handle, PAnsiChar(FuncName)); if Func = nil then raise Exception.Create(Format('Error loading function: "%s"', [FuncName])); end; end; // Aufruf LoadFunction(@pdfGetNumPages, 'pdfGetNumPages'); Result := pdfGetNumPages(pdf); Nun das spannende: Wenn ich das Ganze statisch mache, funktioniert es!
Delphi-Quellcode:
Woran kann das liegen? Gibt es noch eine spezielle Variante von GetProcAdress für cdecl-Dlls?
function pdfGetNumPages(pdf: Pointer): Integer; cdecl;
function pdfGetNumPages; external 'DllName.dll'; Grüße, Jan |
AW: Problem mit dynamischem Laden von DLL mit Aufrufkonvention cdecl
Soweit ich das im Kopf habe muss man das so machen:
Delphi-Quellcode:
Wichtig dabei ist das @ Symbol.
@Func := GetProcAddress(FDLL_Handle, PAnsiChar(FuncName));
|
AW: Problem mit dynamischem Laden von DLL mit Aufrufkonvention cdecl
Danke für die Antwort. Das wird schon wie beschrieben gemacht. In dem Falle nur über den Umweg der "LoadFunction". Dorthin wird schon der Pointer übergeben.
Weitere Ideen? :) |
AW: Problem mit dynamischem Laden von DLL mit Aufrufkonvention cdecl
Das @ bei der Zuweisung ist nicht nötig, denn das macht Delphi implizit, da es weiß, daß bei der zuweisung die Variable und nicht der Funktionsaufruf gemeint ist.
In seiner Funktion ist Func sowieso kein Funktions-Zeiger, sondern ein Pointer und da wäre @ eigentlich total falsch. Aber tausch mal probehalber dein
Delphi-Quellcode:
gegen
LoadFunction(@pdfGetNumPages, 'pdfGetNumPages');
Delphi-Quellcode:
.
pdfGetNumPages := GetProcAddress(FDLL_Handle, 'pdfGetNumPages');
Vielleicht muß es ja anders sein. :gruebel:
Delphi-Quellcode:
procedure LoadFunction(Func: PPointer; const FuncName: AnsiString);
begin if Func^ = nil then begin Func^ := GetProcAddress(FD PS:
Delphi-Quellcode:
... da kennt Delphi auch was Fertiges :zwinker:
raise Exception.CreateFmt('Error loading function: "%s"', [FuncName]);
|
AW: Problem mit dynamischem Laden von DLL mit Aufrufkonvention cdecl
Ohne @ bzw. mit ^ kompiliert es nicht mehr. Kommen wir wohl nicht drum herum. ;) Auch das Umgehen der "LoadFunction" hilft nix.
Es läuft ja prinzipiell auch alles. Es gibt sogar Funktionen, die mit dem dynamischen Aufruf funktionieren. Möglicherweise hat es mit dem Pointer-Parameter zu tun. Methoden, die nur nen Integer als Parameter bekommen, funktionieren nach aktuellem Stand tadellos. |
AW: Problem mit dynamischem Laden von DLL mit Aufrufkonvention cdecl
Wenn es nur darum geht die DLL "irgendwie" erst bei Verwendung zu laden, dann halt so:
Delphi-Quellcode:
Das gibt es wohl im Delphi seit XE/XE2.
function pdfGetNumPages(pdf: Pointer): Integer; cdecl;
function pdfGetNumPages; external 'DllName.dll' delayed; ![]() |
AW: Problem mit dynamischem Laden von DLL mit Aufrufkonvention cdecl
Jo, hatte ich auch schon entdeckt. Nach aktuellem Stand wird mir nichts anderes übrig bleiben. Mich wurmt es nur immer, wenn was nicht klappt und ich nicht weiß, warum. :?
|
AW: Problem mit dynamischem Laden von DLL mit Aufrufkonvention cdecl
Versuch sonst einmal
Delphi-Quellcode:
anstelle von
stdcall
Delphi-Quellcode:
.
cdecl
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz