【问题标题】:Get functions/objects of imported .tlb获取导入的 .tlb 的函数/对象
【发布时间】:2011-12-06 21:01:13
【问题描述】:

我有一个附带 .tlb 文件的程序,可以用我自己的 C++ 程序访问一些函数/对象(读取变量等)。我进行了搜索并导入了 .tlb 文件:

#import "MyLib.tlb" named_guids no_namespace

我也可以使用 oleview.exe 中的 libid 导入它(ProgId 不起作用)。

即使我收到一些警告(如下),我的程序仍然运行:

C4278 ['TextOut', 'CreateEvent', 'DeleteFile'] is already a macro; use the 'rename' qualifier

但是.. 我现在如何才能访问函数/对象? 对不起,我是初学者,所以请耐心等待。 它是否以某种方式与 IDispatch 一起工作?我需要导入更多的 dll 还是需要更多的 #include 指令?

我正在使用 Visual C++ 2008 Express。

--
编辑:好的,抱歉,我已经可以访问对象的标题(我在自动完成中看到“应用程序”),但我不知道如何获取对象。

Object Overview

我想我找到了相关的wikipedia article

【问题讨论】:

标签: c++ visual-studio-2008 com typelib


【解决方案1】:

导入类型库为您提供该库的所有接口和标识符的描述。通常你不应该额外包含任何头文件。您通常应该使用 COM 智能指针创建这些接口并调用它们的方法:

CComPtr pInterface;
pInterface.CoCreateInstance(__uuidof("ClassNameFromTLB"));
pInterface->CallMethod();

【讨论】:

  • 感谢您的回答!我是否需要 CComPtr 的 ATL,因为我有 MSVC++ 2008 Express Edition,而您的代码对我不起作用。你能再解释一下吗?
  • 改用由#import 自动生成的_com_ptr_t 派生的智能指针类型。在 Express 中可用,如果类型库可用,通常是更好的解决方案。
  • 感谢@HansPassant 的提示和链接。但是我真的很难理解。我应该那样做吗?:_COM_SMARTPTR_TYPEDEF(Application, __uuidof(Application)); 然后:_com_ptr_t<Application>::CreateInstance(Application); 类似的东西? 尴尬
  • 编译器已经为您完成了,只需使用 ApplicationPtr 类型。获得好的文档有点困难,至少回顾一下我留下的书链接。
  • 现在我明白了。不知道 CoHexagon 和 IShapeEdit 来自他们的示例。现在我意识到这本书解释得很好!非常感谢@HansPassant!
猜你喜欢
  • 2017-12-12
  • 2019-03-22
  • 2011-08-15
  • 1970-01-01
  • 2011-05-01
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2018-04-01
相关资源
最近更新 更多