5

我正在处理一个旧的 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 生成的文件名?

4

3 回答 3

2

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

于 2011-03-15T13:58:56.487 回答
0

这似乎是一个常见问题,我找不到任何好的解决方案,但一种解决方法是将“_i”附加到您的 idl 文件,例如 EquipmentConstants_i.idl

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

于 2014-12-10T09:16:11.153 回答
0

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

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

您的最终解决方案可能会使用一些#1 和#2。

MIDL 编译器有几个选项可以修改输出文件的名称,或排除输出文件。

直接指定名称:

                         -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 一起使用。

于 2018-05-18T18:46:27.630 回答