Probleme mit DLL einbinden?
-
Hallo,
ich versuche schon die ganze zeit meine DLL Datei, diese in Delphi geschrieben wurde, in C++ Builder einzubinden.Habe das auch so versucht, wie es hier beschrieben wurde:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-39265.html
leider ohne erfolg.In Delphi gibt es zwar eine möglichkeit, C++ Objektdateien für das Projekt zu erzeugen, aber irgendwie geht das nicht.
Habe auch mit dem Tool von Borland "ImpLib" versucht eine Lib von meiner DLL Datei zu erstellen, aber ich weiss nicht, wie ich mit diesem Tool eine Lib Datei basteln kann.
Die Hilfe hat mir auch nicht weitergeholfen.Kann mir vieleicht jemand erklären, wie ich meine DLL Datei ohne Lib in C++ Builder einbinden kann oder wie ich von meiner DLL Datei eine Lib erstellen kann?
Ich bedanke mich schonmal im Voraus.
MfG
-
Hallo,
Lies doch mal das hier.
http://bcb-tutorial.c-plusplus.net/DLL_Tutorial/index.html
-
Danke Dir.
Ich habe das mal durchgearbeitet und bekomme beim Kompilieren einen Fehler:
String MyGetWindowText(HWND Window) { TMyGetWindowText* MyGetWindowText; //Variable des Zeigertyps. String Erg; HINSTANCE h = LoadLibrary("WinApi_Messages.dll"); //DLL wird bei Bedarf geladen. if (h != 0) MyGetWindowText = (TMyGetWindowText*)GetProcAddress(h, "_MyGetWindowText"); if (MyGetWindowText != NULL) Erg = MyGetWindowText(Window); //Aufruf der DLL-Funktion, hier also kein rekursiver Aufruf. else Erg = 0; FreeLibrary(h); //..und nach Gebrauch entladen. return Erg; }
[C++ Fehler] Unit1.cpp(42): E2451 Undefiniertes Symbol 'TMyGetWindowText' [C++ Fehler] Unit1.cpp(46): E2188 Ausdruckssyntax
Ich habe diesen Code:
typedef String TMyGetWindowText(HWND); //z. B. mit dem Namen TCalcVals erzeugen können da die //Übergabeparameter bei beiden Funktionen gleich sind (int, int). String MyGetWindowText(HWND Window); //Schnittstellen-Funktion.
in der Unit1.h eingefügt, unter public.
Ich weiss jetzt nicht, wo der fehler ist, kann es sein, das ich die definitionen falsch eingefügt habe, weil ich habe sie in der Unit1.h eingefügt.
Danke schonmal für die Hilfe.
MfG
-
bruce85 schrieb:
[C++ Fehler] Unit1.cpp(42): E2451 Undefiniertes Symbol 'TMyGetWindowText' [C++ Fehler] Unit1.cpp(46): E2188 Ausdruckssyntax
Das sollte eigentlich funktionieren (und bei mir wird es auch kompiliert). Deine Fehlermeldungen konnte ich jedoch reproduzieren, indem ich den Code oberhalb der Einbindung von Unit1.h plazierte.
Ein paar weitere Anmerkungen zum Code:
- Du könntest es dir einfacher machen, indem du den Typen gleich als Zeiger deklarierst:
typedef String (*TMyGetWindowText) (HWND);
- Gibt es einen Grund, weshalb du die Unit-Funktion, den Funktionszeiger und die DLL-Funktion gleich benennst?
- Überlege mal, was passiert, wenn das Laden der DLL fehlschlägt.
- Bist du sicher, daß du im Fehlerfalle den String "0" zurückgeben willst?
- Die Hinweise bezüglich der modulübergreifenden Verwendung von String, die der DLL-Experte beim Erstellen eines neuen DLL-Projektes in Form eines Kommentars in die .cpp-Datei eingetragen hat, hast du gelesen und nachvollzogen? Falls nein, so wäre es jetzt an der Zeit.
- Was passiert, wenn die DLL-Funktion eine Exception wirft?
-
Danke Dir.
Ich habe das auch erst versucht gehabt, aber dann bekomme ich diesen fehler hier:
[C++ Fehler] Unit1.cpp(52): E2314 Aufruf einer Nicht-Funktion
String MyGetWindowText(HWND Window) { TMyGetWindowText* MyGetWindowText; //Variable des Zeigertyps. String Messages; HINSTANCE h = LoadLibrary("WinApi_Messages.dll"); //DLL wird bei Bedarf geladen. if (h != 0) MyGetWindowText = (TMyGetWindowText*)GetProcAddress(h, "_MyGetWindowText"); if (MyGetWindowText != NULL) Messages = MyGetWindowText(Window); //<<<<<<<FEHLER else Messages = ""; FreeLibrary(h); //..und nach Gebrauch entladen. return Messages; }
Edit: Die Funktion MyGetWindowText existiert aber in meiner DLL Datei:
library WinApi_Messages; uses SysUtils, windows, messages, Classes; {$R *.res} function MyGetWindowText(Window: hWnd): String; stdcall; var dwSize: DWord; begin dwSize := SendMessage(Window, WM_GETTEXTLENGTH, 0, 0) + 1; SetLength(Result, dwSize); dwSize := SendMessage(Window, WM_GETTEXT, dwSize, Integer(Pointer(Result))); SetLength(Result, dwSize); end; exports MyGetWindowText; begin end.
Ich weiss, man kann es für C++ umschreiben, kein problem, aber in der DLL Datei befinden sich mehrere funktionen, die ich in C++ benötige, habe Sie beim Posten entfernt.
Wie kann ich das problem jetzt lösen?
Vielen Dank schonmal.
MfG
-
Hi,
bin mir da nicht sicher aber muß der typdef nicht auch einen namen für den Übergabeparameter angeben. (vorher war nur HWND da)
typedef String TMyGetWindowText(HWND hWindow);
MfG
-
Danke @Destiniy für die antwort.
HWND reicht vollkommen bei der typedef.
Ich versteh nur nicht, wieso er Meldet:
[C++ Fehler] Unit1.cpp(52): E2314 Aufruf einer Nicht-Funktion
An was könnte das denn liegen?
MfG
-
bruce85 schrieb:
An was könnte das denn liegen?
Daran, dass du sowohl eine Funktion als auch eine Variable namens MyGetWindowText hast.
-
Ich habe das so gemacht, wie es im Tutorial: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39265.html erklärt wird.
Dort ist es genauso, das die Variable Zeiger und der Funktion den gleichen Namen hat.Ich habe versucht die Funktion einen anderen Namen zu geben und was passiert?
Ich bekomme dann einen Linker Fehler:[Linker Fehler] Unresolved external 'MyGetWindowText2(void *)' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\Messages\UNIT1.OBJ
Das kann doch nicht so schwer sein, die DLL Datei zu laden mit der Funktion.
Ich weiss echt nicht, wo jetzt der fehler liegt.
MfG
-
bruce85 schrieb:
Ich habe das so gemacht, wie es im Tutorial: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39265.html erklärt wird.
Das will gar nichts heißen. Die Tutorien und FAQ-Einträge hier sind durchaus nicht fehlerfrei. Wenn dein Quelltext aus besagtem Tutorial stammt, wäre es dringend an der Zeit, es auszubessern.
bruce85 schrieb:
Das kann doch nicht so schwer sein, die DLL Datei zu laden mit der Funktion.
Wenn man eine ganze Reihe von Hinweisen bekommt und sie nicht beachtet, ist das kein Wunder.
bruce85 schrieb:
Ich versteh nur nicht, wieso er Meldet:
[C++ Fehler] Unit1.cpp(52): E2314 Aufruf einer Nicht-Funktion
An was könnte das denn liegen?
Vielleicht hast du einerseits folgenden Hinweis umgesetzt:
audacia schrieb:
Du könntest es dir einfacher machen, indem du den Typen gleich als Zeiger deklarierst:
typedef String (*TMyGetWindowText) (HWND);
Jedoch dabei mißachtet, daß
TMyGetWindowText* MyGetWindowText; //Variable des Zeigertyps.
bereits ein Zeiger auf TMyGetWindowText, mithin ein Zeiger auf einen Zeiger ist.
-
Vielen Dank @audacia.
Habe die fehlers mal korrigiert, jetzt Startet wenigstens mein Programm mit der DLL, aber die function gibt mir immer einen leeren String zurück.
Wenn ich in Delphi das Programm teste, also mit der Funktion was in der DLL Datei ist, dann funktioniert alles.
Wieso bekomme ich einen leeren String zurück?
Oder ich schreibe mal eine einfache Addition Funktion in der DLL und versuche sie mal aufzurufen.
Edit: Jetzt funktioniert alles perfekt, habe bei der Funktion aufruf, diesen unterstrich entfernen müssen:
_MyGetWindowText = MyGetWindowText
und vielen Dank für eure Hilfen, Ihr habt mir wirklich weitergeholfen.
MfG