c++ - 预定义的 IDL 文件中没有类型定义

标签 c++ idl midl

首先,

使用 plain C++,没有 ATL,MFC 试图使用 COM 对象接口(interface)。

使用 oleview(OLE/COM 对象查看器)- 用于设计 IDL 代码。

在这个阶段,使用 MIDL 编译器,现在我在尝试生成以下内容时遇到了问题:

命令行语法:

midl/nologo/env win32/tlb ".\S8_.tlb"/h ".\S8_.h"/iid ".\S8_i.c"S8.idl

  • 对应的.TLB(类型库)
  • A.H(标题)
  • 一个 IID 定义包含文件 (*_i.c)
  • 代理 (*_p.c)

MIDL 编译器错误:

S8.IDL(513):错误 MIDL2025:语法错误:期待“S8SimObject”附近的类型规范

    HRESULT LinkSimObjects(
                    [in] S8SimObject* SourceObject, ####line 513 ####
                    [in] S8SimObject* DestObject,
                    [in] float TravelTime);

最佳答案

好吧,我不太明白你在这里的问题,但以下内容应该有所帮助:

  • 公共(public)枚举定义需要有自己的 uuid 才能真正公开。
  • 我已经看到那些枚举定义不会进入类型库,除非它们实际用于某些接口(interface)方法中。我不知道这是什么原因,可能我错过了一些简单的事情(比如将该枚举添加到库 block 中,或其他)。
  • short 通常表示短整数,而不是单精度 float 。
  • 在 VB 中,float 的等价物是 single,但正如我在其他问题中看到的那样,我怀疑您实际上是想替换 singlefloat

顺便说一下,我建议发布一个最小的(可编译的)IDL 文件(去除了大部分定义),它或多或少类似于您要编译的文件。这有助于避免一些混淆,例如,您在文本中使用 IS8Simulation,但在复制的 IDL 片段中使用 S8SimObject。如果您指定预期结果和(对您而言)意外错误,它也会有所帮助。

编辑

好吧,您现在插入的这个编译错误很简单:S8SimObject 未定义。您需要始终在方法声明 (IS8Simulation) 中引用接口(interface),永远不要引用实现该接口(interface)的组件类。

正如您所说,您正在此处更改现有的 IDL 文件:基本目标是什么?如果原始 IDL 文件总是使用 S8SimObject,可能唯一的问题是 S8SimObject 的定义没有包含在 IDL 文件的顶部?如果您有定义 S8SimObject 的类型库,您可以使用 OleView 导出此接口(interface)的 IDL。

关于c++ - 预定义的 IDL 文件中没有类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/431206/

相关文章:

c++ - 从 C++ 应用程序执行的外部程序中的 CPU 负载有限

c++ - 连续 cin 的问题

c++ - 如何在 IDL 中声明宽字符常量

c++ - 错误 MIDL2003 : Redefinition : 'x'

c++ - 从 2 个 vector 中提取元素?

c++ - (make/g++) 包括自动生成的依赖目标的完整路径? (或解决方法)

c++ - 用于编译 .idls 的 Makefile

c++ - MIDL 编译错误 : enum with "cy"

windows-runtime - 如何使用midlrt.exe将.idl编译为.winmd?

windows-runtime - 什么是可组合的运行时类?