DLL Datei erstellen und benutze
-
Warum nimmst du keine .lib ?
Dann musst du mit deinem Programm schon keine DLLs ausliefern
-
Weil ich das gerne auch so können möchte.
-
Was für Vorteile haben denn DLLs (außer dass das Projekt kleiner ist) ?
Weil für DLLs muss man halt jede einzelne Funktion importieren..
-
DarkShadow44 schrieb:
Was für Vorteile haben denn DLLs (außer dass das Projekt kleiner ist) ?
Weil für DLLs muss man halt jede einzelne Funktion importieren..
Wenn mehrere Applikationen auf eine DLL zugreifen wird massiv Speicher gespart, das manuelle Entladen bringt auch in einem einzelnen Programm Speicherersparnis.
-
Kann man dann bei DLLs auch Header nutzen ?
-
dll schrieb:
Die DLL liegt auch im richtigen Ordner was ist den an meiner GetProcAdress Funktion falsch ?
Möglicherweise heisst die Funktion in der DLL anders.
Mit diesem Teil kannst du dir angucken welche Funktionen in der DLL sitzen und überprüfen ob die Funktionsnnamen stimmen:
http://www.dependencywalker.com/Sollte der Funktionsname dort anders aussehen, erstelle eine *.def Datei:
LIBRARY NameDeinerDllOhneEndung EXPORTS Min @1 Max @2 NochNeFunktion @3
Man kann in den Projekteigenschaften bei den meisten C++ IDEs irgendwo ne *.def-Datei angeben (bei VC2008: Linker -> Input -> Module Definition File).
Gib da die vorher erstellte *.def-Datei an und die Funktionsnamen sollten passen.
-
DarkShadow44 schrieb:
Kann man dann bei DLLs auch Header nutzen ?
Klar kann man das und tut es gewöhnlich auch!
-
Hallo mit dem Programm depends von geeky konnte ich den richtigen Funktionsnamen ermitteln jetzt bekomme ich auch die richtige Adresse.
Nur mein Problem ist jetzt noch das ich nicht weiss wie ich die Funktion nun benutzen kann.
Hier lad ich die DLL:
#include <iostream> #include <vcl> using namespace std; #pragma hdrstop #pragma argsused int main(int argc, char* argv[]) { HMODULE h = LoadLibrary("Project1.dll"); HMODULE ret; if (h==0) { cout<<"Project1.dll nicht geladen" << endl; } else { ret = GetProcAddress(h,"@ausgabe$qv"); if (ret == 0) { cout<<"Funktion nachricht nicht gefunden"<<endl; } cout<<"Adress : "<<ret<<endl; FreeLibrary( h ); } system("PAUSE"); return 0; }
Meine DLL Datei:
//--------------------------------------------------------------------------- #include <vcl.h> #include <windows.h> #include <iostream> using namespace std; #pragma hdrstop #pragma argsused __declspec(dllexport) int ausgabe () { cout<<"Hallo"; return 0; } int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //---------------------------------------------------------------------------
-
Sorry, ich muss mich noch einmal melden!
Dein letztes Beispiel will eine Windows-DLL mit einer Konsolen-Anwendung verknüpfen. Entweder beides Windows oder beides Konsole wäre sinnvoll. Gemischt düfte es in die Hose gehen.
Die verschiedenen Wege zum Export und Import der DLL-Funktionen sind dir von anderen Postern nahzu vollständig mitgeteilt worden. Der einfachste Weg ist es, mit implib mydll.lib mydll.dll eine LIB zu machen und diese in die Anwendung einzubinden. Letzteres macht die IDE. Ich verstehe nicht, warum du ohne LIB die DLL einsetzen möchtest.
-
dll schrieb:
Hallo mit dem Programm depends von geeky konnte ich den richtigen Funktionsnamen ermitteln jetzt bekomme ich auch die richtige Adresse.
Nur mein Problem ist jetzt noch das ich nicht weiss wie ich die Funktion nun benutzen kann.
Schau dir mal das wikipedia-Beispiel näher an:
http://de.wikipedia.org/wiki/Dynamic_Link_Library#Einbinden_von_DLLs_zur_Laufzeit(btw: Ich würde lieber die DLL mit ner *.def-Datei erzeugen, der Funktionsname kann sich je nach Compiler-Version sonst möglicherweise mal ändern und die ganze Sache klappt nicht mehr...)