从系统(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 位组件或库(例如 OCX
或 dll
)的注册状态时遇到问题。
实现它的标准过程是通过 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文件