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

标签 windows dll windows-vista

无需调用 regsvr32.exe,可以使用以下步骤注册 .DLL:

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?

注意:运行这段代码时我是以管理员身份登录的。

最佳答案

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

在 UAC 下,对 HKEY_LOCAL_MACHINE 的写入权限需要一个提升的管理员。

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

这意味着您可能希望将 EXE 分成两部分。 “正常”的 asInvoker 部分,以及当检测到需要自注册时,提升的 InstallMyself 部分。当非提升部分检测到首次运行类型条件时,它需要使用 ShellExecute(Ex) 来执行 FirstInstall.exe 部分 - 使用 CreateProcess 或其他一些 API 将简单地失败并出现权限不足错误。 ShellExecute 将显示 UAC 提示符。

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


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

关于windows - 在 Windows Vista 上以编程方式注册 .dll(使用 DllRegisterServer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1388799/

相关文章:

windows - 如何在 Windows 上使用 Firebase 工具?

c# - 从 SQL 表构建 C# dll

ruby-on-rails - 在 Vista 上安装后无法使用 gem 和 ruby​​ 命令

memory - Vista中的静态内存分配会导致崩溃吗?

sql-server - 语义 Web - 将应用程序数据直接存储在 RDF 中或存储在 SQL 中并稍后导出/导入

windows - 如何在 Windows 上执行类似 "sed -"的操作?

windows - 在批处理作业中创建文件名作为时间戳

c++ - 在 Delphi 6 中使用 C++ DLL

c# - 在 C# 应用程序中调用 C++ DLL 函数时如何修复从上下文加载错误

python - 在 Vista 中以管理员身份运行已编译的 python (py2exe)