Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Werkzeuge (https://www.delphipraxis.net/63-sonstige-werkzeuge/)
-   -   DLL einbinden (https://www.delphipraxis.net/165002-dll-einbinden.html)

jobo 9. Dez 2011 14:30

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:
LIBRARY    mylib.dll

EXPORTS
    GetID                   @1   ; GetID
    Go                      @2   ; Go
    Init                    @3   ; Init
    GetID                        = _GetID@4                         
    Go                           = _Go@4                         
    Init                         = _Init@0
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.
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' ;

Luckie 9. Dez 2011 14:41

AW: DLL einbinden
 
Die Aufrufkonvention fehlt, würde ich jetzt mal so auf den ersten Blick sagen.

DeddyH 9. Dez 2011 14:45

AW: DLL einbinden
 
Scheint mir auch so. Ich würde es mal mit cdecl oder stdcall versuchen.

Luckie 9. Dez 2011 14:47

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.

http://www.michael-puff.de/Programmi...entionen.shtml

jobo 9. Dez 2011 15:04

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.

Luckie 9. Dez 2011 15:06

AW: DLL einbinden
 
Sind die Werte denn identisch zu dem VB Programm, die du rein gibst?

Bummi 9. Dez 2011 15:10

AW: DLL einbinden
 
könnte es daran liegen ?

http://msdn.microsoft.com/de-de/libr...(v=vs.80).aspx

jobo 9. Dez 2011 15:10

AW: DLL einbinden
 
Argh %&?!

Es geht!:thumb:

Ja, sie sind identisch ich murks da schon seit 2 Tagen dran rum.

jobo 9. Dez 2011 15:13

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?

sx2008 10. Dez 2011 00:57

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