DLL-Suchpfad für statisch verknüpfte DLLs ändern
Dilemma:
Bei der statischen Verknüpfung von a Wenn Sie eine DLL zu einer Anwendung hinzufügen, sucht sie normalerweise im Verzeichnis der Anwendung nach der DLL. In bestimmten Szenarien befindet sich die DLL jedoch möglicherweise nicht im selben Verzeichnis. Es könnte sich beispielsweise in einem Unterordner befinden, der für „Plugins“ vorgesehen ist.
Mögliche Lösungen:
1. Dynamische Verknüpfung:
Erwägen Sie die Verwendung von LoadLibrary() und GetProcAddress() anstelle einer statischen Verknüpfung, um auf die Funktionalität des Plugins zuzugreifen. Dies gewährleistet eine größere Flexibilität beim Laden der DLL von ihrem vorgesehenen Speicherort.
2. Änderung der Umgebungsvariablen:
Durch Anhängen des Plugin-Ordnerpfads an die PATH-Umgebungsvariable des Systems wird sichergestellt, dass die DLL erfolgreich gefunden und geladen werden kann.
3. Verzögerungslademechanismus:
Verwenden Sie den Verzögerungslademechanismus, um das Laden der Plugin-Funktionalität zu verzögern. Implementieren Sie eine benutzerdefinierte Hilfsfunktion, die die DLLs mithilfe eines bereitgestellten Pfads lädt.
4. Assembly-Erstellung:
Transformieren Sie den Plugin-Ordner in eine Assembly, indem Sie darin eine .manifest-Datei generieren. Legen Sie den Ordner „plugins“ als abhängige Assembly innerhalb der Anwendung fest. Dadurch wird die DLL-Suche innerhalb des Plugin-Ordners gesteuert.
5. Stub-Anwendung und dynamisches Laden:
Unterteilen Sie die Anwendung in eine ausführbare Stub-Datei und eine dynamisch geladene Komponente. Verwenden Sie in der ausführbaren Stub-Datei SetDllDirectory, um den Plugin-Ordner anzugeben. Rufen Sie anschließend LoadLibrary auf und übergeben Sie dabei den vollständigen Pfad zur Datei „appstub.dll“.
Zusätzliche Tipps:
Einen Ordner in eine Assembly umwandeln:
Um ein Verzeichnis mit DLLs in eine Assembly umzuwandeln, fügen Sie dem Ordner eine Datei mit dem Namen „[Ordnername].manifest“ mit folgendem Inhalt hinzu:
<assembly manifestVersion="1.0"> <assemblyIdentity type="Win32" name="Plugins" version="1.0.0.0" processorArchitecture="x86" /> <file name="Plugin.dll"/> </assembly>
Pragma-Direktive zum Laden von DLLs:
Verwenden Sie in Visual Studio 7 oder höher die folgende Pragma-Direktive, um Ihre Anwendung anzuweisen, DLLs aus der Assembly und nicht aus dem lokalen Verzeichnis abzurufen:
#pragma comment(linker, "/manifestdependency:\"name='Plugins' \ processorArchitecture='*' version='1.0.0.0' \ type='win32'\"")
Das obige ist der detaillierte Inhalt vonWie ändere ich den DLL-Suchpfad für statisch verknüpfte DLLs, wenn sich die DLL nicht im Anwendungsverzeichnis befindet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!