使用tlb文件的COM自动化

时间:2009-06-24 10:24:00

标签: c++ com automation typelib

考虑我是Windows环境和COM编程的新手。

我必须自动化应用程序(CANoe)访问。 CANoe将自身公开为COM服务器,并提供CANoe.h,CANoe_i.c和CANoe.tlb文件。 任何人都可以指定如何编写C ++客户端,以访问对象,应用程序的功能。

另外,请指定如何从C ++访问tlb文件中的代码。

3 个答案:

答案 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(....);