使用 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 是适用的。
- 当我尝试将我的应用程序移植到 x64 时,我无法将我的编译器设置为 x86,因此遵循 Post 并没有解决我的问题。
- 我尝试用
C:\Windows\System32\ole32.dll
调用regsvr32.exe
,但结果没有改变。
- 我尝试安装微软提供的热补丁来解决与
OleCreateFromFile()
相同的问题。遗憾的是,它没有解决 OleCreate()
- hotfix 的问题
到目前为止,唯一有效的解决方案是将 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。
我正在尝试使用 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 是适用的。
- 当我尝试将我的应用程序移植到 x64 时,我无法将我的编译器设置为 x86,因此遵循 Post 并没有解决我的问题。
- 我尝试用
C:\Windows\System32\ole32.dll
调用regsvr32.exe
,但结果没有改变。 - 我尝试安装微软提供的热补丁来解决与
OleCreateFromFile()
相同的问题。遗憾的是,它没有解决OleCreate()
- hotfix 的问题
到目前为止,唯一有效的解决方案是将 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。