预定义的 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 到类型库

将接口 IDL 文件转换为 C#

IDL中数字的精度问题:需要定义一个浮点型数组,如【40411323.654,42583654.878】并进行运算。

protobuf(Protocol Buffers).proto文件中的IDL(Interface Definition Language 接口定义语言)是什么?

ATL/COM : 在 IDL 文件中我们可以创建一个可以用作返回类型的类

IDL中如何定义 动态数组?