【问题标题】:Is there a way with MIDL to turn off C-style headers generation?MIDL 有没有办法关闭 C 样式的标头生成?
【发布时间】: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 不是预期的进程,我猜这是您真正的问题需要解决。

标签: c++ com idl midl


【解决方案1】:

不幸的是,没有办法抑制 C 标头的生成。

【讨论】:

  • 有一个解决方法,midl.exe /header nul /iid nul /proxy nul /dlldata nul file.idl,它只会生成file.tlb
  • 抑制所有标头生成,问题是如何抑制 C 语言生成(相对于 C++ 语言生成)
  • 你是对的,我误读了这个问题,可能是对角线。
猜你喜欢
  • 2012-03-11
  • 2010-11-11
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多