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.
Vielen Dank für Ihre Antwort. Leider löst es mein Problem nicht, da ich nicht einmal im UAC-Modus lief. –
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. –
Sie haben Recht! Das Problem tritt nur bei bestimmten DLLs auf. Anscheinend funktioniert das gegebene Stück Code gut für die meisten DLLs. –