C++ Builder6如何使用C#生成的COM lib(TLB)
最近公司有个项目的合作机构,需要导入对方的私有格式数据再在我们的系统中作分析。对方使用C#2010生成的COM接口供我们调用,但是怎么搞都不能正常运行,求高手帮忙。
具体如下:
对方提供了一些dll及对应COM的.tlb文件,以regasm /codebase TestCommonData.dll /tlb:TestCommonData.tlb的方式注册了文件。之后导入C++Builder 6.0的时候为Project->Import Type Library,找到对应的Lib,Palette Page选择COM+,然后点击Create Unit,之后生成了TestCommonData_TLB.cpp/.h 文件。其中包含几个Interface:ITest,ITestData,ITestSet,ITestDescription,每个Interface包含几个Methods和几个属性。其中ITest是属于最外层的接口(大概这么叫吧),包含了两个方法:Retriever(wchar_t * fileName),Release();属性:Name(可以通过GetName()获得,C++builder中好像给成了get_Name()),然后还可以通过GetTestData(),GetTestSet(),GetDescription()方法获得相应的ITestData等类型的指针,然后再调用里面的方法啥的。现在问题因为以前没有接触过COM这些东西,对方提供的示例也是在VC++下的(但是目前由于其他限制我们只能应用在C++Builder中),在VC下可以成功,就是在C++Builder下初始化有问题。
对方提供示例:
Test *test_ptr;
::CoInitialize(NULL);
ITestPtr p(__uuidof(TestCommonData::Test));
test_ptr= p;
test_ptr->Retriever(L"E:\\Temp\\Test.test");
之后再使用GetName()之类的方法就行了。
C++Builder下我也想模仿对方的使用方式:
//Test *test_ptr;
//::CoInitialize(NULL);
//ITestPtr p(__uuidof(TestCommonData::Test)); //报错
//test_ptr= p;
//test_ptr->Retriever(L"E:\\Temp\\Test.test");
但是报错说第三行那里Improper use type ITestPtr,估计是C++Builder这边没有这种构造方式。之后Google了一下,使用CreateInstance方法:
HRESULT hr;
ITest* test_ptr= 0 ;
//std::cout<< "the pointer address is " << test_ptr<< std::endl;
::CoInitialize(NULL);
//std::cout<< "the pointer address is " << test_ptr<< std::endl;
hr = CoCreateInstance(CLSID_Test,0,CLSCTX_INPROC_SERVER,DIID_ITest,(void**)&pA);
//std::cout<< "the pointer address is " << test_ptr<< std::endl;
test_ptr->Retriever(L"E:\\Temp\\Test.test");
每次到左后一行都会跳到BCB的CPU窗口。一下方案也是:
ITestPtr pTestObj;
::CoInitialize(NULL);
pTestObj= CreateComObject(CLSID_Test);
pTestObj->Retrieve(L"E:\\Temp\\Test.test");
COM这块真是没什么概念,再加上时间不等人,也不能从头开始搞起,来求助让大家看看是不是哪里有问题,不胜感激 T_T
(邀请的几个大神是系统推荐的,无耻的伸手党第一次CSDN发帖,若扰见谅)