0

首先,

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

使用oleview (OLE/COM Object viewer) - 用于设计 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);
4

2 回答 2

1

好吧,我在这里不太了解您的问题,但是以下内容应该会有所帮助:

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

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

编辑

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

正如您所说,您正在更改现有的 IDL 文件:基本目标是什么?如果原始 IDL 文件总是使用S8SimObject,也许唯一的问题是S8SimObjectIDL 文件顶部没有包含 的定义?如果你已经定义了类型库S8SimObject,你可以使用 OleView 导出这个接口的 IDL。

于 2009-01-10T16:50:28.550 回答
1

MIDL 编译器错误

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

解决了

添加前向声明- 在 IDL 文件的顶部:

  • 导入“ocidl.idl”;
  • 接口 S8SimObject;
于 2009-01-11T22:42:50.460 回答