首先,
使用 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
,但正如我在其他问题中看到的那样,我怀疑您实际上是想替换single
与float
。
顺便说一下,我建议发布一个最小的(可编译的)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/