首先:使用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。
感觉解决方案已接近,但我不知道哪里出错了。
答案 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);