以编程方式在Windows Vista上注册.dll(使用DllRegisterServer)

时间:2009-09-07 11:02:26

标签: windows dll windows-vista

可以使用以下步骤注册.DLL,而不是调用 regsvr32.exe

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

这在Windows XP上运行正常。遗憾的是,它在Vista上失败了,但只有一些特定的DLL。 hRes变为 E_ACCESSDENIED 。我想这是一个安全问题。有谁知道如何从Windows Vista上的代码注册.DLL?

注意:我在运行此代码时以管理员身份登录。

2 个答案:

答案 0 :(得分:5)

COM注册需要对注册表的HKEY_LOCAL_MACHINE部分进行写访问。

在UAC下,对HKEY_LOCAL_MACHINE的写访问权限需要提升管理员。

获得提升流程的最简单方法是使用指定“requireAdministrator”访问权限的清单创建它。 - 查看项目属性 - >配置属性 - >链接器 - >清单文件 - > UAC执行级别,用于设置正确的设置。

这意味着您可能希望将EXE分成两部分。 'normal'asInvoker部分,并且当自我注册被检测为需求时,升级的InstallMyself部分。当非提升部分检测到首次运行类型的情况时,它需要使用ShellExecute(Ex)来执行FirstInstall.exe部分 - 使用CreateProcess或其他一些API只会因权限不足而失败。 ShellExecute将显示UAC提示符。

可以使用Application Isolation加载COM dll,而无需任何注册步骤。


遗憾的是,原因无法确定。但是,如果您有兴趣进行进一步的研究,那么很有帮助的工具将是来自SysInternals的Process Monitor。 Process Monitor可以记录所有文件,注册表和进程的其他访问权限,包括所有成功和失败代码,这使得调试此类问题变得更加容易,而无需采用更深入的逆向工程方法。

答案 1 :(得分:1)

令人遗憾的是,即使使用Chris Becke's优秀提示,我也无法让所有DLL工作。我不想花太多时间来解决问题,所以现在我只需要调用 regsvr32.exe 。我希望这个.exe出现在所有Windows机器上,所以我想这是一个很好的解决方案。

相关问题