COM+组件的CoCreateInstance失败,返回0x8007007e"找不到指定的模块"

CoCreateInstance of a COM+ component fails with 0x8007007e “The specified module could not be found”

本文关键字:quot 找不到 模块 0x8007007e CoCreateInstance 组件 失败 返回 COM+      更新时间:2023-10-16

我在64位Windows server 2008或64位Windows 7下的COM+目录中有一个COM+组件作为进程内服务器(库应用程序)运行。如果我在C:\Windows\System32中安装32位版本的组件并运行:

HRESULT hr = CoCreateInstance(CLSID_MyClsID, NULL, CLSCTX_INPROC_SERVER, IID_MyInterface, reinterpret_cast<void**>(&_interfaceInstance));

从一个32位的应用程序,一切正常。同样,如果我在C:\下安装该组件的64位版本,并从64位应用程序中调用CoCreateInstance,它将按预期运行。但是,如果我在C:\Windows\System32下安装该组件的64位版本,并尝试从64位应用程序调用CoCreateInstance,则返回值为0x8007007e,表示"找不到指定的模块"。在移动组件之前,我会特别小心地注销它。我还检查了注册表中的InProcServer键是否指向COM+dll的实际路径。我不明白的是,为什么除了在C:\Windows\System32??下安装64位之外,其他一切都能正常工作???任何想法或想法都会受到极大的赞赏。

通常情况下,将组件安装到C:WindowsSystem32似乎是个坏主意:该文件夹归操作系统所有,不用于安装用户程序。

也就是说,您可能被文件系统重定向所困扰:当一个32位程序访问C:WindowsSystem32时,它实际上被重定向到C:WindowsSysWOW64。如果你的安装程序是32位的,那么它实际上并没有将你的64位组件写入你想要的文件夹。当你的64位应用程序运行时,它试图在"真正的"System32文件夹中找到组件,但找不到。

我建议将组件的两个不同版本安装到%ProgramFiles%下新文件夹的x86x64子文件夹中。