DLL einbinden...
-
Hi... Den Faq-Eintrag hab' ich gesehen, bin damit aber nicht zurecht gekommen... Ich mach das ganze zum ersten Mal...
Ich hab' also ein Projekt(DLL). in der automatisch geöffneten Projekt-CPP-Datei(normalerweise Project1.cpp) hab' ich eine Funktion deklariert... Wie kann ich jetzt in einer anderen Form diese Dll einbinden (sodass ich die Funktion nutzen kann)???Ich würd' mich wirklich sehr darüber freuen, ich werd' mal wieder werder aus der BCB-Hilfe ncoh aus der FAQ schlau...
-
-
@F98
Bei deinem dynamische LAden von DLL´s benutzt du Addiere (_Addiere), aber die Funktion heißt in der DLL: Addieren. Du müßtest da mal ein n ran hängen.
-
Im Beispiel wird eine Delphi-DLL geladen, deren Funktion "Addiere" aufgerufen, die 2 int-Werte verlangt. Das Ergebnis der Addition wird in einem Label dargestellt.
Bitte vorher richtig lesen!!!
-
@F98:
Danke, aber richtig weiter komme ich nicht...
Ich hab' nähmlich keine Ahnung, wie oder wo in meinem Projekt ich die DLL dann einbinden muss... Ich hab' keine Ahnung, wo ich irgendeine .lib-Datei finde oder so... Kann mir das jemand erklären...???PS.: ich hab' schon folgendes in dem Projekt gemacht: export "c" __declspec ...
Aber wenn ich die Funktion nutzen will, kommt immer 'n Linker Fehler...
"Undefined Symbol"...[ Dieser Beitrag wurde am 28.02.2003 um 13:29 Uhr von aaaabyx editiert. ]
-
@F98
Ok. Aber das irretiert, wegen der dll die oben beschrieben wird.Wenn du in der dll diese Funktion hast:
int Addieren(int value1, int value2) { int ergebnis; ergebnis = value1 + value2; return ergebnis; }
Vor diesen Zeilen:
#pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; }
Mußt du dan dies einfügen:
extern "C" __declspec(dllexport) int Addieren(int, int);
Wenn du das dann kompelierst, wird eine dll und ne lib erstellt.
Die lib findest du da wo die dll ist.
Wenn du ein Projekt hast, wo du die dll brauchst.
Bindest du dann halt die lib ein (kopier dann die lib ins projekt ordner und die dll dahin wo die exe erzeugt wird.)Unter "Projekt->Datei Projekt hinzufügen" wählst du die lib aus.
Und klickst auf OK (Öffnen).Wo du die dll-Funktion brauchst fügst du das ein:
extern "C" __declspec(dllimport) int Addieren(int, int);
Das muß vor:
#pragma argsused
.
Die dll-Funktion rufst du wie follgt auf:
int a = 5; int b = 15; Addieren(a,b);
Dann müßte es gehen.
Die lib der dll ist immer da wo die dll ist..
Die dll muß immer bei der exe sein.
Die lib kopierst du dann in Projekt verzeichnis.[ Dieser Beitrag wurde am 28.02.2003 um 15:19 Uhr von DJ BlackEagle editiert. ]
-
OK, vielen Dank an euch alle, besonders an dich, DJ BlackEagle...
Es gibt nur ein Problem: Ich finde die Lib's nicht...ich hab's folgendermaßen gemacht:
Projekt---->Projekt neu Compilieren
Daraufhin wird mir im Projektverzeichnis eine dll erstellt, schön und gut, aber keine lib... woran liegt das ????????????????????????
-
Nochmal ich...
Ich hab' jetzt mal die ganze Festplatte nach *.lib durchsucht...
Rausgekommen ist dabei, dass der Compiler überhaupt keine Libs erzeugt...
Wie kann das sein???
Und: Wieso brauchen eigentlich manche Programme nur dll's und keine lib's???
-
Die lib werden in der Programm ein kompiliert, daher brauchen die nur die dlls.
Wo du die dll erstellt hast, hast du auch den als Projekt "DLL Wizard" (KAnn auch nur dLL heißen) benutzt????
-
Nee, hab' ich nicht... Muss man das???
PS.: Wo gibt's den denn?
[ Dieser Beitrag wurde am 28.02.2003 um 16:38 Uhr von aaaabyx editiert. ]
-
Ja, muß man.
Datei->Neues Projekt->DLL Wizard (Ist im neuem Dialog-Fenster).
Um dir das alles leichter zu machen, würde ich dir das immer empfehlen:
1. Projekt Ordner anlegen.
2. Im Projekt Ordner einen Ordner namens "Debug" anlegen.Der Ordner "Debug" ist dafür da, das die exe, dll etc. da rein kommt. Da findest du immer alles schnell und du hast Code,Objekte etc. suabe getrennt.
Wenn du jetzt das Projekt erstellst, mußt du das im Projekt mitteilen.
So machst du das: Projekt->Optionen (Projekt Optionen) und dann unter "Verzeichnisse...".
Da gibt´s einige Textfelder.
Die ersten sind mit Vordefinierten Sachen eingetragen (Nix ändern), unter diesen Vordefinierten Sachen sind welche frei. DIe ersten beiden freien schreibst du das rein: Im 1. "Debug" (Ohne ") und im 2. "Debug\" (Ohne ").Dann kilckst du unten links auf "Standard" und dann auf OK.
Jetzt kommt die dll,exe,objekte immer in diesen Debug ordner rein.
Achtung, wenn du ein neues Projekt erstellst, muß du diesen Ordner erstellen vorher.
Finde es schade das Borland das nicht so macht wie beim MS VC++.und dann in diesem DEbug findest du auch die dll und die LIB...
Für mehr erklärungen: BlackEagle82@web.de (Falls das zum OT wird.)
[ Dieser Beitrag wurde am 28.02.2003 um 17:26 Uhr von DJ BlackEagle editiert. ]
-
Gibt's bei mir nicht... mag daran liegen, dass ich die Version 1.0 des Builders hab'... wie soll ich das hier machen???
Ich hab' das so gemacht: Datei->Neu...(Dialogfeld)->DLL
[ Dieser Beitrag wurde am 28.02.2003 um 17:22 Uhr von aaaabyx editiert. ]
-
Dann müßte es eigentlich geben diese lib.
PS: Lies mein Thread oben nochmal, habe denn editiert...
Wenn wirklich alle Stricke reißen, dann mach es dynamisch..
Hier die erklärung: (Quelle: von F98)
In der Klasse TForm1 (*.h) mußt du im "private"-Bereich, das einfügen:
HINSTANCE DllInstance; // Instanz auf die DLL deklarieren
In der *.cpp benutzt das so:
if(!DllInstance) DllInstance = LoadLibrary("DllName.dll"); // DLL laden if(DllInstance) ShowMessage("DLL wurde geladen."); // Ist dafür das du sehen kannst ob die geladen ist. Aber entfernen, wenn es nicht mehr benötigt wird. // Funktionstyp deklarieren typedef int (__stdcall *IMPFUNC) (int, int); liefern IMPFUNC DllFunktion; int iSumme; if (DllInstance) { // Addresse der Funktion "Addieren" in der DLL herausfinden // Falls die Funktion nicht gefunden wird, einfach vor den // Funktionsnamen ein "_" setzen // Bsp.: statt "Addieren", "_Addieren" verwenden DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "_Addieren"); // DLL-Funktion aufrufen, // An die DLL werden 2 int-Werte übergeben (aus Edit1 und Edit2) // Rückgabewert ist ein int-Wert (Summe) iSumme = DllFunktion(5, 15); ShowMessage(IntToStr(iSumme)); } else { ShowMessage("Bitte DLL laden!"); } if (DllInstance) { if (FreeLibrary(DllInstance)) { DllInstance = NULL; // DLL entladen } } if (!DllInstance) ShowMessage("DLL entgeladen.");
[ Dieser Beitrag wurde am 28.02.2003 um 17:37 Uhr von DJ BlackEagle editiert. ]
-
Hmmmmmmm..........
Also die Einträge wie du sie in deinem vorletzten Beitrag beschreibst(Projekt->Optionen(Projekt Optionen)) gibt es bei mir so nicht...
Weiterhin hab' ich schon 1000 mal versucht, das ganze neu zu compilieren, aber ohne Erfolg... Eine lib hab' ich nie bekommen... Kann es sein, dass der Bc++Builder die lib's nicht (automatisch) generiert...??? Kennt sich sonst noch jemand mit der Version aus?Und vielen Dank, DJ BlackEagle
AAAAAHHHHHHHHHHHHHHHH............... Ich bin langsam am Verzweifeln...
[ Dieser Beitrag wurde am 28.02.2003 um 18:03 Uhr von aaaabyx editiert. ]
-
Wenn die dll kompeliert hast ohne Fehler. DAnn probiers mal mit meinem letzten Thread... DAs muß dann gehen...
-
Meinst du deinen letzten Beitrag(dynamisch laden)???
-
Jo.
OT: Fahre jetzt nach Hause. KAnn dann erst nach 20 Uhr weiter helfen.
-
Das Beispiel da zum dynamisch laden ist mir zu spezifisch... Ich brauch 'n allgemeineres, damit ich weiß, wo ich was machen muss...
Ist übrigens sehr nett von dir, DJ BlackEagle, dass du mir die ganze Zeit hilfst.
-
LIB generieren: "Projekt->Optionen->Linker->Importbibliothek erzeugen" anklicken.
-
Ach Fritzi... Wenn das unter Version 1.0 so einfach wäre...
Das Menü Projekt->Optionen gibt's nicht...Aber:Ich hab' in der Hilfe das hier gefunden:
Das Dienstprogramm IMPLIB erzeugt eine Importbibliothek. IMPLIB akzeptiert als Eingabe DLLs (dynamische Linkbibliotheken), Moduldefinitionsdateien oder beide und erzeugt eine Importbibliothek als Ausgabe.
Beim Erzeugen einer Windows-Anwendung wird immer wenigstens eine Importbibliothek verwendet, und zwar IMPORT32.LIB, die Importbibliothek für die Standard-DLLs von Windows. (IMPORT.LIB wird automatisch gelinkt, wenn eine Windows-Anwendung in der Entwicklungsumgebung erzeugt und BCC32zum Linken verwendet wird. IMPORT32.LIB muß nur dann ausdrücklich gelinkt werden, wenn TLINK32 für ein gesondertes Linken benutzt wird.)Eine Importbibliothek verzeichnet einige oder alle der Exportfunktionen für eine oder mehrere DLLs. IMPLIB erzeugt Importbibliotheken direkt aus DLLs oder aus Moduldefinitionsdateien für DLLs (oder einer Kombination von beiden).
Erzeugen einer Importbibliothek für eine DLL
Optionen sind in Kleinschreibung anzugeben; ihnen ist entweder ein Binde- oder ein Schrägstrich voranzustellen.
Syntax:IMPLIB Optionen BibName [ DefDateien... | DLLs... ] [@Response-Datei]
Hier ist Optionen eine optionale Liste einer oder mehrerer IMPLIB-Optionen, BibName der Name für die neue Importbibliothek, DefDateien eine Liste einer oder mehrerer vorhandener Moduldefinitionsdateien für eine oder mehrere DLLs und DLLs eine Liste einer oder mehrerer existierender DLLs. Es muß zumindest eine DLL oder eine Moduldefinitionsdatei angegeben werden.
Ebenso können Sie eine Response-Datei benutzen, die eine Liste der für Sie abzuarbeitenden .DEF- und .DLL-Dateien enthält. Eine Response-Datei ist eine ASCII-Textdatei, die eine Liste von Dateien enthält. Die Dateien müssen untereinander durch Leerzeichen oder Zeilenschaltung voneinander getrennt sein. Um eine Response-Datei in der Kommandozeile zu spezifizieren, müssen Sie dem Response-Dateinamen einen Klammeraffen (@) voranstellen. Beispielsweise,implib foo.lib @respon.txt
Hinweis: Eine DLL kann außer .DLL auch die Dateinamenserweiterungen .EXE oder .DRV haben.
Option Beschreibung
-c Warnt bei Symbolen, für die Groß- oder Kleinschreibung vorgeschrieben ist.
-f Importe nur über Namen zulassen.
-i Weist IMPLIB an, WEP zu ignorieren, die Windows-Exit-Prozedur, die benötigt wird, um eine dynamische Linkbibliothek zu beenden. Diese Option ist zu verwenden, wenn mehr als eine Linkbibliothek in der Kommandozeile von IMPLIB angegeben wird.
-o Erweiterung des Modulnamens nicht importieren (Nur 16-Bit Windows).
-w Unterdrückt Warnungen.Copyright
1997 Borland International.
Aber ich weiß nicht genau wie ich das jetzt anwenden soll... Kann mir das jemand sagen???