所以,我有一个 COM 对象,我正在尝试使用免注册 COM 加载它。
我为 .ocx 创建了一个清单,如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity type="win32" name="assembly1" version="1.0.0.0" />
<file name="acme.ocx">
<comClass progid="acme.acme.1" clsid="{5C40FA06-EABB-4633-8938-9394F2C933E1}" threadingModel="Apartment" />
</file>
</assembly>
并将其保存为我的部署文件夹中的“assembly1.manifest”。
我的应用程序的 main.cpp 如下所示:
#include <windows.h>
#include <ole2.h>
#pragma comment(linker,"\"/manifestdependency:type='win32' name='assembly1' version='1.0.0.0' \"")
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
CoInitialize(NULL);
CLSID clsid;
auto result = CLSIDFromProgID(TEXT("acme.acme.1"), &clsid);
CoUninitialize();
return 0;
}
当我调试它并检查 CLSIDFromProgID 的结果时,尽管返回了 S_OK,但 clsid 包含的垃圾值与清单中指定为 comClass clsid 的 clsid 不同。查询不同的 clsid 会返回一个空的 clsid 和一个 E_INVALIDCLASSNAME 错误作为结果。
粘在新鲜的 clsid 中。本地测试。仍然失败。