Ich verstehe, dass ich LoadLibrary () verwenden muss. Aber welche anderen Schritte muss ich ausführen, um eine DLL-Datei eines Drittanbieters zu verwenden?
Ich bin einfach in C ++ gesprungen und dies ist der einzige Teil, den ich nicht bekomme (als Java-Programmierer). Ich prüfe nur, wie ich eine Qt- Bibliothek und tesseract-ocr verwenden kann, aber der Prozess macht für mich keinen Sinn und ist so schwer zu googeln.
Wie teile ich dem Compiler die von mir verwendeten Funktionen mit? Sollte es eine Include-Datei des Drittanbieters geben?
c++
visual-studio
winapi
dll
Zombies
quelle
quelle
Antworten:
Wie alle anderen sagen, ist LoadLibrary der schwierige Weg und kaum jemals notwendig.
Die DLL sollte eine .lib-Datei zum Verknüpfen und eine oder mehrere Header-Dateien enthalten, die # in Ihre Quellen aufgenommen werden sollen. Die Header-Dateien definieren die Klassen und Funktionsprototypen, die Sie in der DLL verwenden können. Sie benötigen dies auch, wenn Sie LoadLibrary verwenden.
Um eine Verknüpfung mit der Bibliothek herzustellen, müssen Sie möglicherweise die .lib-Datei zur Projektkonfiguration unter Linker / Eingabe / Zusätzliche Abhängigkeiten hinzufügen.
quelle
#import
um automatisch eine Header-Datei für eine DLL zu generieren und einzuschließen . Der Compiler muss die Deklaration aller Funktionen kennen, damit er den aufrufenden Code erstellen kann.Um DLLs von Drittanbietern in mein VS 2008 C ++ - Projekt zu integrieren, habe ich Folgendes getan (Sie sollten in der Lage sein, in 2010, 2012 usw. Zu übersetzen) ...
Ich habe die Header-Dateien zusammen mit meinen anderen Header-Dateien in meine Lösung eingefügt und Änderungen an meinem Code vorgenommen, um die Funktionen der DLLs aufzurufen (andernfalls, warum sollten wir das alles tun?). : ^) Dann habe ich den Build geändert, um den LIB-Code in meine EXE-Datei zu verknüpfen, die DLLs an ihren Platz zu kopieren und sie zu bereinigen, wenn ich eine 'Bereinigung' durchgeführt habe - ich erkläre diese Änderungen unten.
Angenommen, Sie haben zwei DLLs von Drittanbietern, A.DLL und B.DLL, und Sie haben jeweils eine Stub-LIB-Datei (A.LIB und B.LIB) und Header-Dateien (AH und BH).
(Sie müssen die nächsten Änderungen einmal für jedes von Ihnen verwendete Quell-Build-Ziel vornehmen (Debug, Release).)
Machen Sie Ihre EXE von den LIB-Dateien abhängig
A.LIB B.LIB
$(SolutionDir)fodder
dort waren, ändern Sie es$(SolutionDir)fodder;$(SolutionDir)lib
in "lib".Erzwingen Sie, dass die DLLs in das Ausgabeverzeichnis kopiert werden
XCOPY "$(SolutionDir)"\lib\*.DLL "$(TargetDir)" /D /K /Y
Copy DLLs to Target Directory
No
. Klicken Sie aufOK
.Weisen Sie VS an, die DLLs zu bereinigen, wenn ein Ausgabeordner bereinigt wird:
*.dll
am Ende der Liste hinzu und klicken Sie aufOK
.quelle
Additional Library Directories
inConfiguration Properties -> General
Tab. Bitte hilf mir.Configuration Properties -> Linker -> General -> Additional Library Directories
.XCOPY "$(SolutionDir)\lib\*.DLL" "$(TargetDir)" /D /K /Y
XCOPY
Befehl aus meiner Arbeitskonfiguration kopiert / eingefügt habe . Wollen Sie damit sagen, dass das Zitat falsch platziert ist, weil es bei Ihnen nicht funktioniert hat, oder ist das nur Spekulation?Dies sind zwei Möglichkeiten, eine DLL-Datei in Windows zu verwenden:
Es gibt eine Stub-Bibliothek (.lib) mit zugehörigen Header-Dateien. Wenn Sie Ihre ausführbare Datei mit der lib-Datei verknüpfen, wird die DLL-Datei beim Starten des Programms automatisch geladen.
Manuelles Laden der DLL. Dies ist normalerweise das, was Sie tun möchten, wenn Sie ein Plugin-System entwickeln, in dem viele DLL-Dateien eine gemeinsame Schnittstelle implementieren. Weitere Informationen hierzu finden Sie in der Dokumentation zu LoadLibrary und GetProcAddress .
Für Qt würde ich vermuten, dass Header und eine statische Bibliothek verfügbar sind, die Sie in Ihr Projekt aufnehmen und verknüpfen können.
quelle
/MT
Schalter, der Ihre Bibliotheken statisch verknüpft. Der Vorteil ist, dass kein dynamischer Verbindungsaufwand entsteht . Dies kann jedoch nicht verwendet werden, wenn Sie auch den/clr
Schalter verwenden.dll
undlib
-Dateien erstellt. Es wird keinincludes
Verzeichnis erstellt. Wie kann ich meine Header-Dateien in das Projekt aufnehmen?Um Qt mit dynamischer zu verwenden Verknüpfung müssen Sie die angeben
lib
Dateien ( in der Regelqtmaind.lib
,QtCored4.lib
undQtGuid4.lib
für die „Debug“ configration) inProperties » Linker » Input » Additional Dependencies
.Sie müssen auch den Pfad angeben, in dem sich die Bibliotheken befinden , nämlich in
Properties » Linker » General » Additional Library Directories
.Und Sie müssen sicherstellen, dass die entsprechenden
.dll
s zur Laufzeit verfügbar sind, indem Sie sie entweder im selben Ordner wie Ihr.exe
oder in einem Ordner auf Ihrem Pfad speichern .quelle
Sie müssen LoadLibrary nur verwenden, wenn Sie spät binden und die importierten Funktionen nur zur Laufzeit auflösen möchten. Der einfachste Weg, eine DLL eines Drittanbieters zu verwenden, besteht darin, eine Verknüpfung mit einer .lib herzustellen.
Als Antwort auf Ihre Bearbeitung:
Ja, die Drittanbieter-API sollte aus einer DLL und / oder einer Bibliothek bestehen, die die Implementierungs- und Header-Dateien enthält, die die erforderlichen Typen deklarieren. Sie müssen die Typdefinitionen kennen, unabhängig davon, welche Methode Sie verwenden. Für LoadLibrary müssen Sie Funktionszeiger definieren, damit Sie stattdessen genauso einfach Ihre eigene Header-Datei schreiben können. Grundsätzlich müssen Sie LoadLibrary nur verwenden, wenn Sie eine späte Bindung wünschen. Ein triftiger Grund dafür wäre, wenn Sie nicht sicher sind, ob die DLL auf dem Ziel-PC verfügbar sein wird.
quelle
Wenn Sie davon ausgehen können, dass Sie es verwenden können, sollte die Bibliothek eines Drittanbieters eine * .lib-Datei sowie eine * .dll-Datei enthalten. Sie müssen lediglich die * .lib zur Liste der Eingabedateien in den 'Linker'-Optionen Ihres Projekts hinzufügen.
Diese * .lib-Datei ist nicht unbedingt eine 'statische' Bibliothek (die Code enthält). Stattdessen kann eine * .lib nur eine Datei sein, die Ihre ausführbare Datei mit der DLL verknüpft.
quelle