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