![]() |
DLL einbinden
Hallo,
ich hab hier ein Problem, bei dem ich nicht weiterkomme. Ich hab hier eine DLL, die in Delphi genutzt werden soll. In VB und C# läufts. Doku habe ich zu der DLL nicht. Unter Delphi liefern 2 Funktionen falsche Werte (verglichen mit VB, C#). Das hat mich dazu gebracht, die Funktionen und Parameter genauer zu betrachten. Dabei bin ich schließlich bei implib gelandet. Ich hab aber keine Ahnung, was mir das sagen soll (und implib schmeißt Warnungen wg doppelter Symbole):
Code:
Dynamisch eingebunden bekomme ich lediglich falsche Werte zurück, statisch eingebunden gibts zusätzlich eine AV, wenn ich die Funktion verlasse, die die DLL ruft.
LIBRARY mylib.dll
EXPORTS GetID @1 ; GetID Go @2 ; Go Init @3 ; Init GetID = _GetID@4 Go = _Go@4 Init = _Init@0 Was spricht gegen "doppelte Symbole" ? Ich hätte ohne Vorkenntnis vermutet, dass das die Rückgabewerte sind. Das wäre aber nicht wirklich ein Warngrund, oder? Entsprechen die @ Werte der "Index" Angabe bei statischem Link in Delphi?
Code:
vb
Declare Function Init Lib "mylib.dll" () As Long Declare Function Go Lib "mylib.dll" (ByVal x As Long) As Long
Code:
delphi
function Init() : Integer; external 'mylib' ; function Go(byVal : Integer) : Integer; external 'mylib' ; |
AW: DLL einbinden
Die Aufrufkonvention fehlt, würde ich jetzt mal so auf den ersten Blick sagen.
|
AW: DLL einbinden
Scheint mir auch so. Ich würde es mal mit cdecl oder stdcall versuchen.
|
AW: DLL einbinden
Standardmäßig nimmt Delphi Register. Das ist aber in anderen Programmiersprachen, glaube ich, eher ungewöhnlich. Ich würde auf stdcll tippen. Das ist die übliche Aufrufkonvetion, wenn die DLL in mehreren Programmiersprachen verwendet werden können soll.
![]() |
AW: DLL einbinden
Hallo
ja, danke, der Wald uns so, also Stdcall ist bei dem ganzen Gewurschtel auf der Strecke geblieben. In den dynamischen Aufrufen hatte ich auch StdCall verwendet. Nun gehts wieder ohne AV. Leider nachwievor mit falschem Ergebnis. |
AW: DLL einbinden
Sind die Werte denn identisch zu dem VB Programm, die du rein gibst?
|
AW: DLL einbinden
|
AW: DLL einbinden
Argh %&?!
Es geht!:thumb: Ja, sie sind identisch ich murks da schon seit 2 Tagen dran rum. |
AW: DLL einbinden
Also mir kommen gleich die Tränen.
@Bummi: Datentypen habe ich auch geprüft, in C# sind es normale int, in dem alten VB identisch. Der ganze Mist würde aber bedeuten, dass der einzige Unterschied auf dynamischem VS statischem Link beruht. Kann das sein? |
AW: DLL einbinden
Bei der Deklaration muss übrigens der gesamte Name der DLL angegeben werden; die Endung darf nicht fehlen.
Wenn man ausserdem eine Konstante mit dem Namen der DLL deklariert, kann man bequem an einer Stelle den Namen anpassen:
Delphi-Quellcode:
const
MYLIB_DLL = 'mylib.dll'; type function Init() : Integer; external MYLIB_DLL; function Go(x : Integer) : Integer; external MYLIB_DLL; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 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-2025 by Thomas Breitkreuz