【发布时间】:2014-09-01 05:35:58
【问题描述】:
首先:有使用 CreateDispatch 的现有代码。出于兼容性/方便的原因,维护者不想更改代码(使用新的 TLB/GUID 除外)。
所以我必须创建符合此限制的 COM 对象。最好在 C# 中使用(但 C++ 也可以)。
问题是:我完全没有使用 COM 的经验。
这就是我得到的结果:我在 C# 中创建了一个 COM 对象,注册它并获得了一个 tlb。我检查了注册表,有一个条目:HKEY_CLASSES_ROOT\Wow6432Node\CLSID{36E6BC94-308C-4952-84E6-109041990EF7}
看起来不错。下一步:创建一个测试程序(C++)。我创建了一个启用了 MFC 的 C++ 控制台项目,导入了 tlb。然后我在 main 中添加了以下几行:
CInterface01 server;
COleException* pe = new COleException;
LPTSTR m = new TCHAR[255];
CoInitialize(NULL);
server.CreateDispatch(L"{36E6BC94-308C-4952-84E6-109041990EF7}", pe);
pe->GetErrorMessage(m, 255);
不知何故 CreateDispatch 不起作用。在异常中显示:“类未注册”(什么?!它在注册表中)。更糟糕的是:当我再次运行相同的程序时,它会使 Visual Studio 崩溃。
感觉解决方案就在附近,但我不知道出了什么问题。
【问题讨论】:
-
CreateDispatch() 有两个重载。一个是 CLSID,您将使用 CLSIDFromString() 辅助函数来转换您使用的字符串。另一个接受一个字符串,一个 ProgId。你会使用(比如说)“ClassLibrary1.Class1”。
-
CLSIDFromProgID(L"ComServer2.CSCOMClass01", &id);返回一个NULL类,CLSIDFromString(L"{36E6BC94-308C-4952-84E6-109041990EF7}", &id);返回id = {CLSID_ComServer2.CSCOMClass01},但是结果是一样的 -
如果没有任何关于如何注册 .NET 程序集的信息,您将不得不搜索“类未注册”。这 1.58 亿次点击可以解释您的问题。