Eine DLL für alle Windows-Programme verfügbar machen (win10 pro x64)

475
ilya

Aufgrund der (für diese Frage nicht relevanten) Einschränkungen der OpenGL-Implementierung in Virtualbox (nur OpenGL Version 1.1 verfügbar, aber ich brauche mindestens Version 2.0), entschied ich mich, die Softwareimplementierung in Form einer DLL (namens opengl32.dll ) zu verwenden, die dies tun kann von hier heruntergeladen werden: ftp://ftp.blender.org/sergey/softwaregl/

Eine Möglichkeit, dies zu tun, besteht darin, die Datei opengl32.dll direkt im selben Verzeichnis wie die ausführbare Datei abzulegen .

Meine Frage ist: Was ist der beste Weg, um diese Software-Implementierung für alle Programme verfügbar zu machen, ohne die DLL-Dateien zu kopieren.

Wichtiger Hinweis: Alle 32 - Bit - Anwendungen müssen die Datei opengl32.dll aus dem Verzeichnis / win32 / dieser FTP - Server, während alle 64 - Bit - Anwendungen, die die Datei benötigen opengl32.dll (gleicher Name, aber es ist eine andere Datei!) Von der Verzeichnis / win64 / . Wenn ich also eine 32-Bit- und eine 64-Bit-Anwendung in einem Verzeichnis auf meinem Computer installiert habe, funktioniert die Lösung, die DLL in demselben Ordner abzulegen, nicht: Es ist nicht möglich, zwei unterschiedliche Dateien mit demselben Namen in demselben Ordner zu haben Verzeichnis.

1
Siehe https://stackoverflow.com/questions/949959/why-do-64-bit-dlls-go-to-system32-and-32-bit-dlls-to-syswow64-on-64-bit-windows igagis vor 5 Jahren 0

3 Antworten auf die Frage

1
harrymc

Die übliche Lösung besteht darin, zwei Unterordner wie diese zu haben:

Installation folder |--- Win32 DLL |--- Win64 DLL 

Das Programm .exebefindet sich im Hauptordner, wird jedoch nicht direkt aufgerufen. Stattdessen wird es über eine .batDatei gestartet, die prüft, ob Windows 32- oder 64-Bit-Bit hat, und startet das .exeim Kontext des entsprechenden Unterordners. Eine DLL wird in mehreren Ordnern durchsucht, von denen einer der aktuelle Ordner ist.

Informationen zur Überprüfung des 64-Bit- oder 32-Bit-Betriebssystems finden Sie in der Post- Batch-Datei .

Wenn Sie sich Sorgen machen, dass die .batDatei als schwarzes Rechteckfenster angezeigt wird, können Sie sie wie im Beitrag beschrieben als ausgeblendet starten. Eine Batchdatei vollständig versteckt ausführen . Ein GUI-Programm, das aus einer solchen versteckten Batchdatei gestartet wird, wird nicht selbst ausgeblendet.

Was meinen Sie mit den Worten "die .exe im Kontext eines Unterordners starten"? ilya vor 5 Jahren 0
Ich meine konzeptionell, `cd Win32DLL` oder` cd Win64DLL` zu tun, bevor `.. \ prog.exe` ausgeführt wird. Pfade sollten expliziter als diese kurze Version geschrieben werden. harrymc vor 5 Jahren 0
1
igagis

Sie müssen Ihre 64bit dllauf c:\Windows\System32und Ihre 32bit dllauf setzen c:\Windows\SysWOW64.

Beachten Sie, dass auf Originaldateien von Windows 10 OpenGL32.dllnur der TrustedInstallerBenutzer zugreifen kann. Um sie zu ersetzen, müssen Sie den Besitz dieser Dateien in ändern Administrator. Für mich war es nicht möglich, dies mit einer beliebigen Benutzeroberfläche zu tun, aber der Kommandozeilenansatz funktionierte. Führen Sie dazu den Command Promptals Administrator aus. Verwenden Sie dann die folgenden Befehle, um die Originaldateien zu löschen OpenGL32.dll:

takeown /F C:\Windows\System32\OpenGL32.dll /A icacls C:\Windows\System32\OpenGL32.dll /T /grant administrators:F move C:\Windows\System32\OpenGL32.dll C:\Windows\System32\OpenGL32.dll.orig

Gleiches für das C:\Windows\SysWOW64Verzeichnis.

Danach kopieren Sie einfach Ihre eigenen OpenGL32.dllals Administrator an diese Speicherorte.

0
MSalters

Die Verwendung des KnownDLLMechanismus kann helfen. Bekannte DLLs umgehen die Suche im Dateisystem und werden stattdessen aus einem einzigen festen Verzeichnis geladen. Praktischerweise gibt es ein KnownDLL-Verzeichnis für 64-Bit-Prozesse und ein KnownDLL32-Verzeichnis für 32-Bit-Prozesse.

Könnten Sie bitte etwas näher erläutern? googeln durch "knowndll" hilft leider nicht viel. ilya vor 5 Jahren 0
@ilya: Kurz gesagt, "KnownDLL" ist eine Liste von DLL-Namen, die von Windows zwischengespeichert werden. Sie müssen sie also nicht auf der Festplatte finden, wenn Sie sie laden. Der Name stammt von dem Registrierungsschlüssel, in dem sie aufgeführt sind. Weitere Informationen finden Sie unter https://stackoverflow.com/questions/3555749/microsoft-known-dll. Durch Hinzufügen von "opengl32.dll" zu dieser Liste können Sie Windows mitteilen, wo sich "opengl32.dll" auf der Festplatte befindet. MSalters vor 5 Jahren 0