2012-08-25 49 views
4

如何使用MIDL爲x86和x64生成代碼?如何使用MIDL生成x86和x64代碼?

我在Visual Studio 2010中創建了一個IDL文件,當我在x86模式下編譯產品,然後在x64中編譯產品時,我必須「觸摸」IDL文件,以便重新生成與x64相關的代碼。我能以某種方式告訴MIDL將兩個代碼生成到同一個文件中嗎?

+0

我不知道如果我unterstood你的問題的權利,但如果你談論.net和目標系統嘗試使用AnyCPU比assambly每天都要工作平臺上。 – rekire

+0

我正在談論C/C++代碼。不是.net。 – DiGMi

+0

只需創建x86和64位配置並在兩者中構建您的項目。您將爲每個配置獲得單獨的一組二進制文件。 midl本身產生的工件(.c,.h,.tlb等)不會綁定到CPU。但是,midl有一個命令行鍵:'/ env win32 | x64' – tuxSlayer

回答

0

IDL文件定義了一個接口,該接口可以使用64位平臺功能或32位平臺功能。一個IDL可以用來生成一個存根;如果一個接口沒有32位平臺特定的定義或者64位平臺特定的定義,據推測可能會生成存根(即一個IDL文件)。但是,這取決於您所暴露的界面。簡而言之,如果您將接口定義爲兼容32位和64位,則不需要兩個不同的IDL文件 - 否則您需要兩個不同的IDL文件。

不知道什麼是「觸摸」(這通常意味着更新文件,w.r.t.軟件工程的日期/時間)表示,很難說具體需要做什麼。

+0

通過觸摸,他意味着刪除,移動,重命名,無論如何強制重建* .c輸出。問題是代理,它們在32位和64位之間不一樣。 –

0

如果你指的是生成的文件夾下的文件,你不會看到,如果所有您更改是目標平臺改變他們(當然,除非你放置的#ifdef在IDL塊使用平臺特定的定義)。請記住,MIDL的輸出是源代碼,而不是二進制文件。生成的代碼中使用的數據類型的名稱不會更改,因此即使編譯器所針對的計算機體系結構不同,MIDL的輸出也將保持不變。

您可以通過複製XXX_i.h和XXX_i.c文件並在平臺之間比較它們來驗證此情況。要做到這一點,建立,複製,重建,然後比較文件;唯一不同的是時間戳。

因此,回到你原來的問題:你已經在做它!

+0

* _i。c文件可能只有時間戳有所不同,但代理是不同的故事,它們非常不同,並且在切換配置時鏈接器會失敗,除非重建或刪除強制重建的* .c文件。這不好。 –

0

我知道這是一個古老的問題,但是如果其他人在這裏遇到這個問題,我是如何解決它的。

在包含IDL文件的項目,我添加了一個預生成事件到刪除的MIDL輸出文件,這樣所有的平臺和配置...

我可以只刪除僥倖代理(_p)文件,因爲這是唯一的特定於平臺的MIDL生成文件。

如果您的代理存根源文件具有不同的名稱或擴展名,請使用這些文件。