考虑我是Windows环境和COM编程的新手。
我必须自动化应用程序(CANoe)访问。 CANoe将自身公开为COM服务器,并提供CANoe.h,CANoe_i.c和CANoe.tlb文件。 任何人都可以指定如何编写C ++客户端,以访问对象,应用程序的功能。
另外,请指定如何从C ++访问tlb文件中的代码。
答案 0 :(得分:9)
Visual Studio有很多内置支持,可以将类型库导入到C ++项目中并使用这样定义的对象。例如,您可以使用#import
指令:
#import "CANoe.tlb"
这会导入类型库,并将其转换为头文件和实现文件 - 这也会导致实现文件与您的项目一起构建,并且包含头文件,所以这里有很多神奇的东西
然后,为类型库中定义的类型和对象获取智能指针包装器的大量typedef。例如,如果有一个名为Application
的CoClass实现了接口IApplication
,那么您可以这样做:
ApplicationPtr app(__uuidof(Application));
这会导致在运行时创建coclass应用程序并绑定到变量app
,您可以像这样调用它:
app->DoSomeCoolStuff();
通过检查COM调用的结果并根据需要抛出相应的_com_error异常来完成错误处理,这意味着您需要安全地编写异常。
答案 1 :(得分:1)
使用import
指令导入.tlb文件 - 这将为您提供与COM组件公开的接口相当的C ++。
您还需要将COM组件注册到注册表(在组件的.dll文件上运行regsvr32)。之后,您可以调用CoCreateInstance()(或_com_ptr_t :: CreateInstance(),因为它通常更方便)来创建实现该接口的类的实例。然后,您可以调用接口的方法 - 它的工作方式几乎与它是普通的C ++接口和类一样。
答案 2 :(得分:0)
更简单的方法是使用 #include
语句在.cpp文件中包含.h和_i.c项目。
由于您没有获得dll并且只提供了tlb,您可以使用regtlibv12.exe注册tlb,这是visual studio的一部分(这是VS2005版本)。通过注册tlb,将在注册表中创建适当的条目,然后您可以根据需要使用COM库功能。
编辑:顺便说一下,无论如何都需要DLL来成功实例化COM组件。
要创建接口指针,更安全的方法之一是使用CComPTR,如:
CComPtr myPtr;
myPtr.CoCreateInstance(__uuidof("ClassNamehere"));
myPtr->Method(....);