从系统(SysWOW64)目录外部注册 32 位 COM 时出现问题

Posted

技术标签:

【中文标题】从系统(SysWOW64)目录外部注册 32 位 COM 时出现问题【英文标题】:Issue when registering 32bit COM from outside the system(SysWOW64) directory 【发布时间】:2021-03-24 15:58:11 【问题描述】:

为了编译直接依赖于它的项目,我在完成 32 位组件或库(例如 OCXdll)的注册状态时遇到问题。

实现它的标准过程是通过 SysWOW64 文件夹中的 regsvr32.exe 指向组件/库目标的参数,例如C:\Windows\SysWOW64\regsvr32.exe someComponent.ocx.

但是,在弄乱了注册表并重新安装组件之后,这是我让它工作的唯一方法 是将.ocx 及其依赖文件复制到SysWOW64

只有在使用 regsvr32(都在同一个 SysWOW64 文件夹中)之后,Visual Studio 编译器才能成功编译它,有点像它对我已经这样做的事实视而不见 - 证明 反过来,由于 Windows 注册表中存在密钥。

有没有人经历过这样的事情,为什么它只能通过 SysWOW64 系统文件夹中“直接”存在的组件而不是其他一些非系统文件夹中的“远程”来注册??

谢谢

【问题讨论】:

没有要求在系统目录中注册COM对象,但很难猜测messing with the registry是什么意思或坏了。编译失败的具体错误信息是什么? Visual Studio 的错误消息是 TypeInitializationException,HRESULT:0x8007007E,有什么线索吗? 确保以管理员模式运行regsvr32,以便成功注册DLL或OCX。 @dasquest 0x8007007E is ERROR_MOD_NOT_FOUND "找不到指定的模块"。很可能缺少注册表项,或指向错误的路径。您可以使用Process Monitor 来检查正在查找的内容。 @dxiv 这就是catch-22,上面已经注册了密钥,但是VS编译器没有得到它,即使在清除和重建项目之后也是如此。由于它在特定 CLSID 的上下文中报告该异常,并且在注册表中有这样一个确切的条目,它增加了混乱。 【参考方案1】:

所以这些都不是正确的,但我将留下这个答案,因为 OP 确认它们都不正确,从而缩小了问题范围。

有几种方法可能会出错。所有这些情况都不起作用:

在 C:\Program Files 中注册 32 位 dll。 在 C:\Windows\System32 中注册 32 位 dll 在当前目录位于其中一个目录中或之下时注册 32 位 dll。 未注册为管理员。这会在 32 位代码中造成混乱,从而导致令人困惑的问题。

【讨论】:

没有一个错过,不用担心。无论如何,感谢您的尝试。

以上是关于从系统(SysWOW64)目录外部注册 32 位 COM 时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

Windows_01_Windows系统的中的32位和64位(System32和SysWOW64)

Wow6432Node(32位程序的注册表内容都在这个节点下,也可直接使用%systemroot%syswow64 egedit进行编辑)

求助,本人win10 64位,现在要注册oraoledb12.dll注册表。按照说明将dll文件

VB6插件注册

dll文件32位64位检测工具以及Windows文件夹SysWow64的坑(很详细,还有自动动手编程探测dll)

Delphi 禁用x64位系统文件重定向功能