C#COM对象和CreateDispatch

时间:2014-07-10 18:03:49

标签: c# c++ com mfc

首先:使用CreateDispatch存在现有代码。维护者不希望出于兼容性/便利性原因更改代码(除了使用新的TLB / GUID)。

所以我必须创建适用于此限制的COM对象。优先考虑C#(但C ++也没问题。)

问题是:我完全没有使用COM的经验。

这就是我得到了多远:我在C#中创建了一个COM对象,注册了它并得到了一个tlb。我检查了注册表,有一个条目:HKEY_CLASSES_ROOT \ Wow6432Node \ CLSID {36E6BC94-308C-4952-84E6-109041990EF7}

似乎很好。下一步:创建测试程序(C ++)。我创建了一个启用了MFC的C ++控制台项目,导入了tlb。然后我在主要部分添加了以下几行:

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。

感觉解决方案已接近,但我不知道哪里出错了。

1 个答案:

答案 0 :(得分:-1)

您需要这样的代码:

//interface wrapper method implementations for
#import "YouTlbModule.tlb" no_namespace


//function
CoInitializeEx ( NULL, COINIT_MULTITHREADED);

IYouTlbModulePtr ptrYouTlbModule;

HRESULT hResult = ptrYouTlbModule.CreateInstance(OLESTR("Your.Component.Name"));

//test hResult

//Others function call

hResult = ptrYouTlbModule.Other(122, L"AAA");

//Call
int ret = ptrYouTlbInput.GetErrorMessage(m, 255);