C# COM object and CreateDispatch

本文关键字:CreateDispatch and object COM | 更新日期: 2023-09-27 18:12:27

首先:存在使用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不工作。在Exception中,它读到:"类未注册"(什么?!)在注册表里)。更糟糕的是:当我再次运行同一个程序时,它会使Visual Studio崩溃。

感觉解决方案就在附近,但我不知道哪里出了问题。

C# COM object and CreateDispatch

您需要这样的代码:

<>之前//接口包装器方法实现# YouTlbModule进口"。tlb"no_namespace//函数CoInitializeEx (NULL, coinit_multithread);IYouTlbModulePtr ptrYouTlbModule;HRESULT HRESULT = ptrYouTlbModule.CreateInstance(OLESTR("Your.Component.Name"));//测试hResult//其他函数调用hResult = ptrYouTlbModule。其他(122 L"AAA");//调用int ret = ptrYouTlbInput。GetErrorMessage (m, 255);