预定义的IDL FILE中没有类型定义

时间:2009-01-10 16:06:51

标签: c++ idl midl

首先,

使用 plain C ++,没有ATL,MFC尝试使用COM Object接口。

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

在此阶段,使用 MIDL 编译器,现在我无法尝试生成以下内容:

cmd行语法:

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);

2 个答案:

答案 0 :(得分:1)

嗯,我真的不明白你的问题,但是下面应该有所帮助:

  • 公开枚举定义需要让自己的 uuid 真正公开。
  • 我已经看到那些枚举定义不会进入类型库,除非它们实际上在某些接口方法中使用。我不知道这个的原因,可能是我错过了一些简单的东西(比如将这个枚举添加到库块中,或者其他什么)。
  • short通常表示一个短整数,而不是单精度浮点数。
  • VB中的float相当于single,但正如我在其他问题上看到的那样,我怀疑您实际上是指用single替换float

顺便说一句,我建议发布一个最小的(可编译的)IDL文件(删除大多数定义),这或多或少类似于你要编译的内容。这有助于避免一些混淆,例如您在文本中使用IS8Simulation,但在复制的IDL代码段中使用S8SimObject。如果您指定预期结果和意外(适合您)错误,它也会有所帮助。

修改

嗯,您现在插入的编译错误很简单:S8SimObject未定义。您需要始终在方法声明(IS8Simulation)中引用接口,而不是引用实现接口的coclass。

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

答案 1 :(得分:1)

MIDL编译器错误

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

解决

在IDL文件的顶部添加转发声明

  • import“ocidl.idl”;
  • interface S8SimObject;