使用 64 位 (C++) 编译时 OleCreate 失败并显示 E_CLASSNOTREG

OleCreate fails with E_CLASSNOTREG when compiled with 64-Bit (C++)

我正在尝试使用 OLE 在 Widget 中显示一个新的 Word 文档。只要我在 x86 架构下编译我的应用程序,这就可以正常工作。现在我尝试将我的应用程序移植到 x64,但它停止工作了。对 OleCreate() 的调用失败并显示 REGDB_E_CLASSNOTREG

CLSID clsID;
IUnknown* pIUnknown;
HRESULT res = CLSIDFromProgID(L"Word.Document.8", &clsID);
if (SUCCEEDED(res)) {
   res = OleCreate(clsID, IID_IUnknown, OLERENDER_DRAW, NULL, NULL, storage, reinterpret_cast<void**>(&pIUnknown));
}

经过一番研究,我找到了一些解决方案,但其中 none 是适用的。

到目前为止,唯一有效的解决方案是将 HKLM\SOFTWARE\SysWow64\Classes\CLSID\<CLSID of Word Document> 的内容复制到 HKLM\SOFTWARE\Classes\CLSID\<CLSID of Word Document> 中,但这与其说是修复,不如说是破解,因为我必须修改注册表我想要 运行 我的应用程序的每台机器。由于此任务需要管理员权限,我无法从我的应用程序内部执行此操作。

我需要一个有效且不会强迫我手动更改注册表项的解决方案。

我运行在装有 32 位 Office 2010 的 Windows 7 Professional SP1 64 位机器上运行我的应用程序。

经过更多测试后,我找到了问题的解决方案,即使用 Word.Document 而不是 Word.Document.8 作为 progID。 我不知道为什么这似乎是 64 位编译的问题。不过,我注意到的是 CLSIDFromProgID() 现在解析为不同的 CLSID。