题
首先,
使用 清楚的 C++,没有ATL,MFC尝试使用COM Object接口。
使用 奥莱维尤 (OLE/COM 对象查看器)- 用于设计 IDL 代码。
在此阶段,使用 中度语言 编译器,现在我在尝试生成以下内容时遇到问题:
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
MIDL 编译器错误
S8.IDL(513) : 错误 MIDL2025 :语法错误:期待接近的类型规范 “S8Sim对象”
解决了
添加一个 前向声明 - 在 IDL 文件的顶部:
- 导入“ocidl.idl”;
- 接口S8SimObject;
其他提示
好吧,我不太明白你的问题,但以下内容应该有所帮助:
- 公共枚举定义需要有自己的 uuid 真正公开。
- 我已经看到这些枚举定义不会进入类型库,除非它们实际在某些接口方法中使用。我不知道这样做的原因,可能我错过了一些简单的事情(比如将该枚举添加到库块中,或者其他什么)。
short
通常表示短整数,而不是单精度浮点数。- 相当于
float
是single
在VB中,但正如我在你的其他问题中看到的那样,我怀疑你实际上是指替换single
和float
.
顺便说一句,我建议发布一个最小的(可编译的)IDL 文件(删除了大多数定义),它或多或少类似于您要编译的文件。这有助于避免一些混乱,例如您正在使用 IS8Simulation
在你的文字中,但是 S8SimObject
在您复制的 IDL 片段中。如果您指定预期的结果和意外的(对您来说)错误也会有所帮助。
编辑
好吧,您现在插入的这个编译错误很简单: S8SimObject
没有定义。您需要始终在方法声明中引用接口(IS8Simulation
),永远不要到实现该接口的组件类。
正如您所说,您要在此处更改现有的 IDL 文件:基本目标是什么?如果原始 IDL 文件始终使用 S8SimObject
, ,也许唯一的问题是定义 S8SimObject
没有包含在 IDL 文件的顶部吗?如果您有类型库定义 S8SimObject
周围,可以使用OleView导出该界面的IDL。