【发布时间】:2011-09-09 11:04:35
【问题描述】:
我有一个简单的 .IDL 文件 (iface.idl),它描述了一个基于 IUnknown 的接口:
import "unknwn.idl";
[
uuid(80DFDD28-F033-431e-B027-CDD2078FC78A)
]
interface ISunPathCalc : IUnknown {
HRESULT Square([in, out] long * pVal);
HRESULT Cube([in, out] long * pVal);
};
当尝试使用midl /header iface.h iface.idl 编译它时,我得到了 3 个文件:iface.h、iface_i.c 和 iface_p.c。 iface.h 文件包含 ISunpathCalc 接口的 C++ 声明:
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("80DFDD28-F033-431e-B027-CDD2078FC78A")
ISunPathCalc : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE Square(
/* [out][in] */ long *pVal) = 0;
virtual HRESULT STDMETHODCALLTYPE Cube(
/* [out][in] */ long *pVal) = 0;
};
#else /* C style interface */
该文件剩余的较大部分包含不必要的 C 内容。
问:有没有办法告诉 MIDL 只生成标头的 C++ 部分? 是否可以关闭生成 iface_i.c 和 iface_p.c 文件并强制 MIDL 生成 C++ 定义?
UPD1:
我尝试添加指定的 [local] 属性 here:
[
local,
uuid(80DFDD28-F033-431e-B027-CDD2078FC78A)
]
但没有任何成功。
【问题讨论】:
-
[local] 只是告诉 MIDL 您不会跨进程边界使用接口,因此它省略了编组代码,但仍然使用标头。我不认为只做 C++ 头文件的选项。鉴于 C 风格的接口会被预处理器跳过,你为什么要关心它们首先生成?
-
好吧。我喜欢我的房间干净,也喜欢我的代码:)说真的,接口的代码从 IDL 生成后,我将它移动到一个 MinGW 目标项目中。但是,C 部分中的某些宏会引发错误消息。
-
这很奇怪。显然,由于您说您不需要 C 部分,因此不能编译 C 部分,因此如果您在其中遇到错误,则意味着守卫
#defines 不是预期的进程,我猜这是您真正的问题需要解决。