2009-09-07 10 views
5

Statt Aufruf regsvr32.exe Registrierung, kann man eine DLL mit den folgenden Schritten registrieren:Programatically .dll unter Windows Vista (mit DllRegisterServer)

HINSTANCE hLib = ::LoadLibraryEx(dllPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); 
HRESULT (STDAPICALLTYPE* lpDllEntryPoint)(void); 
(FARPROC&)lpDllEntryPoint = ::GetProcAddress(hLib, "DllRegisterServer"); 
const HRESULT hRes = (*lpDllEntryPoint)(); 

Das auf Windows XP einwandfrei funktioniert. Bedauerlicherweise funktioniert es unter Vista nicht, aber nur mit bestimmten DLLs. hRes wird E_ACCESSDENIED. Ich denke, das ist ein Sicherheitsproblem. Kann jemand eine .DLL von Code auf Windows Vista registrieren?

Hinweis: Ich war bei der Ausführung dieses Codes als Administrator angemeldet.

Antwort

5

COM-Registrierung erfordert Schreibzugriff auf den HKEY_LOCAL_MACHINE-Teil der Registrierung.

Unter UAC erfordert der Schreibzugriff auf HKEY_LOCAL_MACHINE einen erhöhten Administrator.

Der einfachste Weg, einen erhöhten Prozess zu erhalten, besteht darin, ihn mit einem Manifest zu erstellen, das den 'requireAdministrator'-Zugriff angibt. - Suchen Sie unter den Projekteigenschaften -> Konfigurationseigenschaften -> Linker -> Manifestdatei -> UAC-Ausführungsebene, um die richtige Einstellung vorzunehmen.

Dies bedeutet, dass Sie wahrscheinlich Ihre EXE in zwei Teile teilen möchten. Der "normale" asInvoker-Teil und, wenn die Selbstregistrierung als Anforderung erkannt wird, ein erhöhter InstallMyself-Teil. Wenn der nicht erhöhte Teil eine Erstausführungsart erkennt, muss er ShellExecute (Ex) verwenden, um den FirstInstall.exe-Teil auszuführen - mit CreateProcess oder einer anderen API wird einfach ein Fehler mit unzureichenden Rechten verursacht. ShellExecute wird die UAC-Eingabeaufforderung anzeigen.

Es ist möglich, Application Isolation zu verwenden, um COM-DLLs ohne Registrierungsschritt zu laden.


Es ist bedauerlich, dass die Ursache nicht festgestellt werden kann. Wenn Sie jedoch an weiteren Forschungen interessiert sind, wäre ein Prozess, der viel hilft, Process Monitor von SysInternals. Process Monitor kann alle die Datei, Registry und andere Zugriffe für einen Prozess, einschließlich aller Erfolg und Fehlercodes protokollieren, so dass es viel einfacher ist, Probleme wie diese zu debuggen, ohne auf tiefere Mittel des Reverse Engineering zurückgreifen zu müssen.

+0

Vielen Dank für Ihre Antwort. Leider löst es mein Problem nicht, da ich nicht einmal im UAC-Modus lief. –

+0

Es sollte/sollte ein spezifisches Problem mit der com dll sein, die Sie registrieren möchten. Es gibt keinen wirklichen Grund, dass eine com dll unter Vista scheitern sollte, wenn sie direkt von einem erhöhten Administratorkonto registriert wird. Vielleicht regsvr32.exe initialisiert die COM-Wohnung vor dem Aufruf von DllRegisterServer? (d. h., Sie müssen CoInitialize anrufen?) Wenn Sie Ihre eigene com dll erstellt haben und den Registrierungscode, der direkt aufgerufen wird, bereinigt haben, würden Sie sicher kein Problem bemerken. –

+0

Sie haben Recht! Das Problem tritt nur bei bestimmten DLLs auf. Anscheinend funktioniert das gegebene Stück Code gut für die meisten DLLs. –

1

Bedauerlicherweise konnte ich dies nicht für alle DLLs, auch mit Chris Becke's ausgezeichnete Tipps. Ich wollte nicht zu viel Zeit damit verbringen, das Problem zu lösen, also rufe ich jetzt einfach regsvr32.exe an. Ich erwarte, dass diese .exe auf allen Windows-Rechnern vorhanden ist, also denke ich, dass es eine gute Lösung ist.

Verwandte Themen