预定义的 IDL 文件中没有类型定义
Posted
技术标签:
【中文标题】预定义的 IDL 文件中没有类型定义【英文标题】:No type definitions in pre-defined IDL FILE 【发布时间】:2010-09-30 16:19:18 【问题描述】:首先,
使用 plain C++,没有 ATL,MFC 尝试使用 COM 对象接口。
使用 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);
【问题讨论】:
【参考方案1】:好吧,我不太明白你的问题,但以下应该会有所帮助:
公共枚举定义需要有自己的 uuid 才能真正公开。 我已经看到这些枚举定义不会进入类型库,除非它们实际用于某些接口方法。我不知道这是什么原因,可能我错过了一些简单的事情(比如将该枚举添加到库块中,或其他)。short
通常表示一个短整数,而不是单精度浮点数。
float
的等价物在 VB 中是 single
,但正如我在您的其他问题上看到的那样,我怀疑您实际上是想用 float
替换 single
。
顺便说一句,我建议发布一个最小的(可编译的)IDL 文件(去除了大多数定义),它或多或少类似于您要编译的内容。这有助于避免一些混淆,例如,您在文本中使用 IS8Simulation
,但在复制的 IDL sn-p 中使用 S8SimObject
。如果您指定预期的结果和意外的(对您而言)错误,这也会有所帮助。
编辑
嗯,你现在插入的这个编译错误很简单:S8SimObject
没有定义。您需要始终在方法声明中引用接口 (IS8Simulation
),而不是引用实现该接口的 coclass。
正如您所说,您在这里更改了现有的 IDL 文件:基本目标是什么?如果原始IDL文件总是使用S8SimObject
,那么可能唯一的问题是S8SimObject
的定义没有包含在IDL文件的顶部?如果你有定义S8SimObject
的类型库,你可以使用OleView导出这个接口的IDL。
【讨论】:
【参考方案2】:MIDL 编译器错误
S8.IDL(513) : error MIDL2025 : 语法错误 : 期望 "S8SimObject"
附近有一个类型规范已解决
添加前向声明 - 在 IDL 文件的顶部:
导入“ocidl.idl”; 接口 S8SimObject;【讨论】:
以上是关于预定义的 IDL 文件中没有类型定义的主要内容,如果未能解决你的问题,请参考以下文章
IDL中数字的精度问题:需要定义一个浮点型数组,如【40411323.654,42583654.878】并进行运算。
protobuf(Protocol Buffers).proto文件中的IDL(Interface Definition Language 接口定义语言)是什么?