2017-11-08 9 views
0

Ich verwende VS2010 und ich habe eine geschichtete Anwendung, die wie folgt aussieht:Wie Verknüpfung zu einer Funktion von einer DLL, die von einer DLL geladen wird?

app.exe 
DLL1.dll 
DLL2.dll 

wo app.exe Lasten DLL1 und DLL2 dann lädt. Ich möchte, dass meine App in DLL2 eine Funktion wie DLL2::setvariable(value) aufruft.

Ich habe dies in meinem vc6-Arbeitsbereich richtig eingerichtet, ohne die lib-Datei für DLL2.dll angeben zu müssen. Wie kann ich dies in meiner VS2010-Umgebung einrichten? Ich bekomme immer einen ungelösten Symbol-Linker-Fehler für alle Aufrufe an DLL2.dll.

Ich habe versucht, #pragma comment(lib ,"DLL2.lib") sowohl app.exe und DLL1.dll aufzunehmen und verbindet aber tut diese Last DLL2.dll und alle zweimal seine Variablen?

+1

_ "... aber lädt das DLL2.dll und alle seine Variablen zweimal?" _ Nein –

+0

Ist das der richtige Weg? – Mozly

+0

Der Linker kann möglicherweise nicht mit einer DLL ohne eine Importbibliothek verknüpfen. Es spielt keine Rolle, ob Sie ein Werkzeug verwenden, das 2 Jahrzehnte alt ist oder ein neues. – IInspectable

Antwort

2

Eine DLL wird nur einmal in den Adressraum einer Anwendung geladen. Dies ist durch Windows-Design. Eine Import-Bibliothek für eine DLL lädt die DLL (LoadLibrary()) und weist den DLL-Funktionen lokale Funktionsnamen zu. Sie könnten das gleiche selbst tun, indem Sie LoadLibrary() und GetProcAddress() anrufen.

Nach der Documentation:

Das System unterhält eine pro Prozess Referenzzählwert auf allen geladenen Module. Der Aufruf von LoadLibrary erhöht die Referenzzählung. Durch Aufrufen der FreeLibrary- oder FreeLibraryAndExitThread-Funktion wird die Anzahl der Referenzen verringert. Das System entlädt ein Modul, wenn seine Referenzzählung null erreicht oder wenn der Prozess beendet wird (unabhängig von der Referenzzählung).

Also nein, eine DLL wird nur einmal geladen, nur seine „UseCount“ wird auf 2 gesetzt

ich dies in meinem vc6 Arbeitsplatz richtig eingerichtet haben, ohne für die Lib-Datei angeben zu müssen DLL2.dll

ich denke, man nicht DLL2::setvariable(value) von app.exe riefen sonst dann, wie Sie es getan haben?

Ist dies der richtige Weg?

Dies ist eine Möglichkeit, es zu tun (auch wenn man einfach die lib in das Projekt gehören könnte - wie die meisten Entwickler tun - anstatt die #pragma zu verwenden, aber die rseult ist gleich). Die andere Alternative ist Anruf LoadLibrary()/GetProcAddress() selbst (nützlich, wenn Sie die DLL bedingt laden möchten). Es gibt keine andere Möglichkeit, die mir bewusst ist.

+0

Ich rief DLL2.dll von meiner app.exe im vc6-Projekt. Ich denke, es gibt eine implizite Einstellung, die die DLL zur Kompilierungszeit verbindet. Ich bin neu in VC6. – Mozly

+0

Ja, die ** Import-Bibliothek ** (nicht die DLL, diese wird zur Laufzeit dynamisch geladen/verlinkt), muss irgendwie in das Projekt eingefügt worden sein (vielleicht durch das '# pragma' in einer Include-Datei?), Sonst würden Sie Linkfehler bekommen, das ist was ich meinte. –