更改IDL生成的头文件

时间:2011-01-28 04:12:33

标签: c++ com idl

我正在研究遗留的c ++ COM项目,我正在转移到Visual Studio 2010.在这个项目的IDL文件中,我必须从另一个c ++项目中引用一个ODL文件。我的问题是另一个项目生成其头文件为$(filename)_h.h。当我的IDL文件生成其头文件时,它会生成ODL文件名为$ filename.h,并且它无法引用正确的文件。

换句话说,在我的IDL文件(“MyIDLFile.idl”)中,我有一个声明,如

导入“MyODLFile.odl”

生成的文件(“MyIDLFile.h”)中的

变为

包括“MyODLFile.h”

当我需要它来生成

包括“MyODLFile_h.h”

如何指定我希望IDL在import语句中生成的文件名?

3 个答案:

答案 0 :(得分:2)

我不确定你对import语句的意思,但你正在寻找的东西可以在项目的属性下找到。转到属性窗口(Alt-F7)并在“配置属性/ MIDL /输出”下,您将有机会声明要创建的头文件。由于您的项目是遗留的,因此从头文件名中删除“_h”可能更容易(例如$(ProjectName).h而不是$(ProjectName)_h.h)。有关详细信息,请参阅http://support.microsoft.com/kb/321274

答案 1 :(得分:0)

这似乎是一个常见的问题,我找不到任何好的解决方案,但有一种解决方法是在你的idl文件中添加'_i',例如EquipmentConstants_i.idl

Microsoft确实引用了/ header编译开关,但我无法使其工作(midl /header switch)。

答案 2 :(得分:0)

这是处理IDL文件时要解决的常见问题。好消息是有几种方法可以解决这个问题:

  1. 使用MIDL编译器的选项来更改生成的输出
  2. 对组件进行分层,以便在不同的路径中编译冲突的文件。您还可以控制生成的文件的发布方式。然后,需要包含它的代码可以控制文件的包含位置。
  3. 您的最终解决方案可能会使用#1和#2。

    MIDL编译器有several options来修改输出文件的名称或排除输出文件。

    直接指定名称:

                             -OUTPUT FILE NAMES-
    /cstub filename    Specify client stub file name
    /dlldata filename  Specify dlldata file name
    /h filename        Specify header file name
    /header filename   Specify header file name
    /iid filename      Specify interface UUID file name
    /proxy filename    Specify proxy file name
    /sstub filename    Specify server stub file name
    /tlb filename      Specify type library file name
    

    跳过输出文件:

                           -OUTPUT FILE GENERATION-
    /client none       Do not generate client files
    /server none       Generate no server files
    /notlb             Don't generate the tlb file
    

    我个人使用/ prefix选项来避免过去的标题冲突。

    /no_default_epv    Do not generate a default entry-point vector
    /prefix client str Add "str" prefix to client-side entry points
    /prefix server str Add "str" prefix to server-side manager routines
    /prefix switch str Add "str" prefix to switch routine prototypes
    /prefix all str    Add "str" prefix to all routines
    

    这是一个例子:

    /prefix client HIDE_
    

    方法foo的接口将在标题中重命名为HIDE_foo。

    其他有效的策略与您如何分层目录,构建顺序和发布文件,使用包含路径以及订购实际包含有关。我只习惯使用带有dir文件和build.exe的源代码,因此我无法提供任何有关VS如何使用的建议。