所以,我有一个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。在本地测试。仍然失败。