4

如何使用 MIDL 为 x86 和 x64 生成代码?

我在 Visual Studio 2010 中创建了一个 IDL 文件,当我在 x86 模式下编译产品时,然后在 x64 中编译产品时,我必须“触摸”该 IDL 文件,以便它重新生成与 x64 相关的代码。我可以以某种方式告诉 MIDL 将两个代码生成到同一个文件中吗?

4

3 回答 3

0

如果您指的是 Generated Files 文件夹下的文件,如果您更改的只是目标平台,您将不会看到它们发生变化(好吧,除非您在 IDL 中放置了使用特定于平台的定义的 #ifdef 块) . 请记住,MIDL 的输出是源代码,而不是二进制文件。生成的代码中使用的数据类型的名称不会改变,因此 MIDL 的输出将是相同的,即使编译器所针对的机器架构不同。

您可以通过复制 XXX_i.h 和 XXX_i.c 文件并在平台之间进行比较来验证这一点。为此,构建、复制、重建,然后比较文件;唯一应该不同的是时间戳。

所以,回到你原来的问题:你已经这样做了!

于 2012-09-06T17:18:15.563 回答
0

IDL 文件定义了一个接口,该接口可以使用 64 位平台功能或 32 位平台功能。IDL 可用于生成存根;如果接口没有特定于 32 位平台的定义或特定于 64 位平台的定义,则可以生成存根(即一个 IDL 文件)。但是,这取决于您公开的接口。简短的回答:如果您将接口定义为 32 位和 64 位兼容,则您不需要两个不同的 IDL 文件——否则您需要两个不同的 IDL 文件。

在不知道“触摸”(通常意味着更新文件的日期/时间,软件工程)意味着什么的情况下,很难具体说明您需要做什么。

于 2012-09-04T18:16:26.933 回答
0

我知道这是一个老问题,但如果其他人在这里打这个是我解决它的方法。

在包含 IDL 文件的项目中,我向所有删除 MIDL 输出文件的平台和配置添加了一个预构建事件,如下所示......

if exist $(ProjectName).h del $(ProjectName).h
if exist $(ProjectName)_i.c del $(ProjectName)_i.c
if exist $(ProjectName)_p.c del $(ProjectName)_p.c

我本可以只删除代理 (_p) 文件,因为这是唯一特定于平台的 MIDL 生成文件。

如果您的代理存根源文件具有不同的名称或扩展名,请使用它们。

于 2016-02-04T15:21:32.363 回答