Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用tlb文件的COM自动化_C++_Com_Automation_Typelib - Fatal编程技术网

C++ 使用tlb文件的COM自动化

C++ 使用tlb文件的COM自动化,c++,com,automation,typelib,C++,Com,Automation,Typelib,我是windows环境和COM编程的新手 我必须自动化应用程序(CANoe)访问。CANoe将自己公开为COM服务器,并提供CANoe.h、CANoe_i.c和CANoe.tlb文件。 任何人都可以指定如何编写C++客户端,用于访问对象、应用程序的功能。 也请指定如何访问C++中TLB文件中存在的代码。< P>使用代码>导入< /Cult>指令导入TLB文件——这将给C++提供一个与COM组件公开的接口等价的. 您还需要将COM组件注册到注册表(在组件的.dll文件上运行regsvr32)。之后

我是windows环境和COM编程的新手

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

< P>使用代码>导入< /Cult>指令导入TLB文件——这将给C++提供一个与COM组件公开的接口等价的.</P>
您还需要将COM组件注册到注册表(在组件的.dll文件上运行regsvr32)。之后,您可以调用CoCreateInstance()(或者通常更方便的_com_ptr_t::CreateInstance())来创建实现该接口的类的实例。然后,可以调用接口的方法——它的工作方式与普通的C++接口和类几乎相同。

VisualStudio有很多内置的支持,将类型库导入到C++项目中,并使用定义的对象。例如,您可以使用

#import
指令:

#import "CANoe.tlb"
这将导入类型库,并将其转换为头文件和实现文件-还将导致实现文件与您的项目一起构建,并包含头文件,因此这是很多神奇的东西

然后,对于类型库中定义的类型和对象,您将获得大量用于智能指针包装器的typedef。例如,如果有一个名为
Application
的CoClass实现了接口
iaapplication
,则可以执行以下操作:

ApplicationPtr app(__uuidof(Application));
这将导致在运行时创建coclass应用程序并将其绑定到变量
app
,您可以这样调用它:

app->DoSomeCoolStuff();

错误处理是通过检查COM调用的结果,并在必要时抛出适当的“COM错误异常”来完成的,因此这意味着您需要安全地编写异常。

更简单的方法是使用
\include
语句在.cpp文件中同时包含.h和_i.c项目

由于未向您提供dll且仅提供tlb,因此您可以使用作为visual studio一部分的regtlibv12.exe(这是VS2005版本)注册tlb。通过注册tlb,将在注册表中创建适当的条目,然后您可以根据需要使用COM库功能

编辑:顺便说一句,您仍然需要DLL来成功实例化COM组件

要创建接口指针,更安全的方法之一是使用CComPTR,如:


CComPtr myPtr;
myPtr.CoCreateInstance(__uuidof("ClassNamehere"));
myPtr->Method(....);


如果没有DLL,他将无法实例化组件并调试客户端程序。是的,但tlb文件很可能只包含接口定义,需要单独注册。关于DLL,你是对的,不过他应该有它来实例化组件。那么,关于单独的tlb注册是可能的,你是对的。但是,当COM组件的COM支持不完整且不支持DllRegisterServer和DllGetClassObject时,通常使用这种方法作为最后手段。在需要将接口定义与其实现分开的地方,可以这样做。e、 例如,一个必须在多个COM组件中以不同方式实现的接口,这样的接口可以移出,并且可以为该接口创建单独的tlb。实现该接口的所有组件都将简单地导入该tlb并从那里继续。感谢大家的快速响应。我没有应用程序的DLL文件,所以我更喜欢这种方法。在我的源文件中导入“CANoe.tlb”后,出现以下编译错误。-未知字符“0x1”-语法错误:缺少“;”标识符“A”之前-缺少类型说明符-假定为int。注意:C++不支持缺省INT-“{”:缺少函数头(旧样式的正式列表)?请建议,如果我缺少一些步骤。是否有一种方法来验证TLB文件内容并解决这些错误。谢谢AdvaseI建议您解决它,如果您不管理,只需单独提供一个问题,提供足够的细节。