Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Delphi DLL und deren Import in C/C++ (https://www.delphipraxis.net/94581-delphi-dll-und-deren-import-c-c.html)

c113plpbr 23. Jun 2007 17:26


Delphi DLL und deren Import in C/C++
 
Hi DP'ler,

ich versuche eine von mir in Delphi erstellte DLL in ein C/C++ Projekt im Visual Studio einzubinden.
Da ich sowas bisher noch nie zuvor gemacht hab, hab ich auch dementsprechend keine Ahnung. Ich hab mich daher ein wenig Informiert, und die einzige Möglichkeit eine DLL statisch einzubinden ist scheinbar eine .lib-Datei. Ich habe auch noch gelesen, dass man sich so ne lib-Datei mit dem Tool "implib" erstellen kann. Wenn ich die damit erstellte lib-Datei dann aber in Visual Studio einbinde (per #pragma comment(lib, "lib.lib") ), dann krieg ich immer noch den Fehler, dass ich einen Verweis auf ein nichtaufgelöstes Symbol in meinem Code habe.

Kennt jemand das Problem? Oder gibt es auch noch andere Möglichkeiten eine DLL statisch einzubinden oder eine lib-Datei zu erstellen?

danke,
Philipp

mkinzler 23. Jun 2007 17:31

Re: Delphi DLL und deren Import in C/C++
 
http://www.dsdt.info/tutorials/dlls/

c113plpbr 23. Jun 2007 17:40

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
http://www.dsdt.info/tutorials/dlls/

Is da irgendwo ein Teil drin, der mir sagt, wie ich ne Delphi DLL in ein C/C++ Projekt einbinden kann? Wenn ja, hab ich ihn nicht gefunden, und DLL's in Delphi kann ich bereits schreiben ... ;)

mkinzler 23. Jun 2007 17:46

Re: Delphi DLL und deren Import in C/C++
 
Wenn du auf Delphispezialitäten wie Strings u.ä. im Interface verzichtest, kannst du die Dlls wie jede andere in C-Programme einbinden.

c113plpbr 23. Jun 2007 17:52

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
Wenn du auf Delphispezialitäten wie Strings u.ä. im Interface verzichtest, kannst du die Dlls wie jede andere in C-Programme einbinden.

Und genau darum geht es ja, wie geht das?! Delphi erstellt mir ja schliesslich keine lib-datei!
(Hast du dir eigentlich meinen ersten Post überhaupt durchgelesen?)

mkinzler 23. Jun 2007 17:54

Re: Delphi DLL und deren Import in C/C++
 
Nein in kann nämlich gar nicht Lesen
man könnte auch die Hilfer zum C-Kompiler Lesen und würde dann auf IMPLIB stossen

c113plpbr 23. Jun 2007 18:04

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
Nein in kann nämlich gar nicht Lesen

Hab ich dir irgendwas getan? Oder bist du heut schlecht drauf?

Ich wollte dir nur sagen, dass die Seite hinter dem Link den du gepostet hast mein Problem noch nichtmal anschneidet, genauso wie deine zweite Antwort.

Zitat:

Zitat von mkinzler
man könnte auch die Hilfer zum C-Kompiler Lesen und würde dann auf IMPLIB stossen

Was für ein Problem ich damit habe habe ich doch erläutert, oder?

Und das lässt mich eben zu dem Schluss kommen, dass du meinen Post gar nicht erst durchgelesen hast. Ich will dich damit in keiner weise beschuldigen, aber ich denke, dass dies eben nahe liegt.

mkinzler 23. Jun 2007 18:06

Re: Delphi DLL und deren Import in C/C++
 
libs werden per Linker eingebunden.

D.Schmidt 23. Jun 2007 18:08

Re: Delphi DLL und deren Import in C/C++
 
HI Philipp

zum Beispiel so:

in den Header schreibst du unter der privaten Deklaration

HINSTANCE DllInstance;

in deine Unit schreibst du es so:

if (!DllInstance)DllInstance = LoadLibrary("Test.dll"); // DLL Laden

if (DllInstance) Form1->Caption =" DLL wurde geladen ";
else
Form1->Caption = " DLL wurde nicht geladen ";


somit hast du die Delphi DLL geladen und kannst somit diese nutzen
um auf die Funktionen zuzugreifen schreibst du folgendes:

typedef PChar(_stdcall *IMPFUNC) ();

IMPFUNC DllFunktion;

if (DllInstance) {
DllFunktion = (IMPFUNC)GetProcAddress(DllInstance,"Der Name der Funktion hier eintragen");

if (DllFunktion) {
Memo1->Lines->Add(DllFunktion());

}
else
Memo1->Lines->Add("Funktionsname existiert nicht");
}
else
{
Memo1->Lines->Add("Bitte Dll laden");
}



somit kannst du unter C++ eine Delphi dll einbinden
ich habe die Delphi DLL in den BCB mit eingebunden und es funzt sehr gut

Daniel

c113plpbr 23. Jun 2007 18:19

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
libs werden per Linker eingebunden.

Wenn ichs per "/IMPLIB:libname.lib" mache, sagt mir der linker "fatal error LNK1136: Ungültige oder beschädigte Datei."
Ich denke, dass das Problem an meiner Lib-Datei liegt, die ich mir mit dem Borland implib-tool erstellt habe.

@D.Schmidt:
Du bindest in deinem Beispiel die DLL dynamisch zur Laufzeit ein, ich würde dies aber der Einfachheit halber gerne statisch machen (wobei ich an der "Einfachheit" dieser Methode langsam zu zweifeln anfange).

mkinzler 23. Jun 2007 18:21

Re: Delphi DLL und deren Import in C/C++
 
Für die Einbindung in Visual C solltest du das IMPLIB de VS nehmen.

c113plpbr 23. Jun 2007 18:27

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
Für die Einbindung in Visual C solltest du das IMPLIB de VS nehmen.

Ich kriege den selben Fehler, ob ich das ganze per zusätzlicher Befehlszeilenoption reinschreibe, in den Linker Einstellungen unter Eingabe zu den "Zusätzlichen Abhängigkeiten" eintrage oder einfach die Lib-Datei zur Projektmappe hinzufüge.

mkinzler 23. Jun 2007 18:28

Re: Delphi DLL und deren Import in C/C++
 
Wie sieht das Interface der Dll aus? Hat diese weitere Abhängigkeiten?

c113plpbr 23. Jun 2007 18:37

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
Wie sieht das Interface der Dll aus? Hat diese weitere Abhängigkeiten?

Wie meinst du das? Es is einfach nur ne Delphi-Dll, die ein paar Funktionen exportiert, mehr nicht.

mkinzler 23. Jun 2007 18:37

Re: Delphi DLL und deren Import in C/C++
 
Verwendest du Delphi-spezifische Typen?

c113plpbr 23. Jun 2007 18:47

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
Verwendest du Delphi-spezifische Typen?

Nein, aber das würde doch die lib-datei nicht kümmern ... oder?

Gibts denn noch andere Methoden eine lib datei zu erstellen?

mkinzler 23. Jun 2007 18:49

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Nein, aber das würde doch die lib-datei nicht kümmern ... oder?
Doch es muß doch der Importcode generiert werden
Funktioniert den die dynamische Methode?

c113plpbr 23. Jun 2007 19:03

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
Zitat:

Nein, aber das würde doch die lib-datei nicht kümmern ... oder?
Doch es muß doch der Importcode generiert werden

Steht da denn irgendwas von den Funktionsparametern drin? Ich dachte, die kommen erst mit der Headerdatei ins Spiel.
Zitat:

Zitat von mkinzler
Funktioniert den die dynamische Methode?

In einem Delphi-Projekt geht der Import sowohl statisch als auch dynamisch, in C hab ichs bisher noch nicht probiert.

mkinzler 23. Jun 2007 19:08

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Steht da denn irgendwas von den Funktionsparametern drin? Ich dachte, die kommen erst mit der Headerdatei ins Spiel.
In der Lib wird die Dll geladen und die Funktionen erzeugt, die dann die in der Dll aufrufen.

c113plpbr 23. Jun 2007 19:22

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
Zitat:

Steht da denn irgendwas von den Funktionsparametern drin? Ich dachte, die kommen erst mit der Headerdatei ins Spiel.
In der Lib wird die Dll geladen und die Funktionen erzeugt, die dann die in der Dll aufrufen.

Naja, ich kenn mich da wie gesagt absolut nicht aus.

Ich habe mir jetzt jedenfalls eine lib-Datei mit dem im vc enthaltenen "lib" Tool über eine .def Datei erstellt, die kann ich auch ins vs einbinden, ohne Fehler, aber dann findet das teil meine Funktion trotzdem nicht:
"error LNK2019: Verweis auf nicht aufgelöstes externes Symbol"

mkinzler 23. Jun 2007 19:28

Re: Delphi DLL und deren Import in C/C++
 
Welche Typen hast du den in den Funktionen?

c113plpbr 23. Jun 2007 19:35

Re: Delphi DLL und deren Import in C/C++
 
Zitat:

Zitat von mkinzler
Welche Typen hast du den in den Funktionen?

Pointer, DWORD, Byte, BOOL

pdug 8. Jul 2007 03:07

Re: Delphi DLL und deren Import in C/C++
 
Frisch getestet:

DLL my.dll erstellt mit Borland Studio 2006 (Delphi für Win32 Dll Projekt)
my.lib importiert mit MS Visual Studio 2005 (C++ für Win32 Projekt)


my.def erstellen mit BORLAND:
Code:
IMPDEF my.def my.dll
my.lib erstellen mit MSVC:
Code:
LIB /MACHINE:x86 /DEF:my.def
Textdatei def.tmp als Vorlage für .def Datei mit MSVC erstellen (falls IMPDEF Probleme macht.):
Code:
DUMPBIN /EXPORTS /OUT:def.tmp my.dll

Oder DEF Datei per Hand:
Code:
LIBRARY    MY.DLL

DESCRIPTION 'MY Dll'

EXPORTS
    myFunction       ; comment
Im Header:

Code:
#define DLLPACK __declspec(dllimport)

extern "C" {
  DLLPACK float myFunction(void);
}

my.lib in Projekt einbinden und fertig.


p.s. Kann - außer etwas Tipparbeit - keinen Nachteil des Ladens zur Laufzeit sehen. Im Gegenteil: So kann sich ein Programm definiert verhalten selbst wenn die DLL fehlt. Verzicht auf die DLL durch statisches linken ist mit einer Importbibliothek ja eh nicht drin.

pdug 8. Jul 2007 03:13

Re: Delphi DLL und deren Import in C/C++
 
Ach und für die Header Datei siehe natürlich Dr Bobs Headconv


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:58 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