2011-01-05 76 views
2

在我公司,我們使用.def文件來指定需要導出的符號。 (我希望我可以使用更現代化的自動化技術,不幸的是,那些決定在八十年代生活的人)。將32位.def文件轉換爲64位

手動編寫.def文件,使用手動複製粘貼是無聊和容易出錯,但到目前爲止,我可以忍受它。

但是,我需要爲64位版本的DLL編寫類似的.def文件。幾個函數的名稱修飾發生了變化,我想知道是否有辦法從32位版本生成64位版本的.def文件。

您知道有任何可以幫到您的工具嗎?這是否現實?我真的不覺得我想再一次手動做它。任何解決方案,甚至包括編碼我自己的工具的解決方案都是受歡迎的

謝謝。

+0

嘿,我還活着回到80年代呢! – 2011-01-05 16:47:24

回答

2

我可能會__declspec(dllexport)我想要的符號,編譯,然後在生成的DLL上運行dumpbin/exports來獲取重名的名稱,然後您可以刪除__declspec並生成一個.def文件。

+0

+1。感謝這個想法。聽起來很有效。不過,我想盡量減少對源代碼的修改。我想用宏來有條件地放/刪除'__declspec'語句而不修改源代碼應該工作? – ereOn 2011-01-05 15:30:09

+0

添加一個宏或添加__declspec將會將代碼更改爲相同的數量。我沒有看到任何風險。 但是,如果你真的不想改變代碼,我想你可以將它編譯爲調試,加載一個EXE,將DLL上的loadlibrary加載到windbg中並執行「x Mymodule!*」,它將列出所有符號,然後你可以從那裏選擇你想要的。 – jcopenha 2011-01-05 15:37:33

1

告訴你的老闆回到80年代。嚴重的是,這不是導出符號名稱的便攜方式。如果C++編譯器更改名稱修改方案會怎樣?然後你必須重新做這個(jcopenha說的)。如果你不在那裏工作會發生什麼?另一個可憐的靈魂將不得不花費寶貴的時間來了解什麼以及如何去做?我會盡量說服老闆使用__declspec(dllexport)。它現在可以節省時間,並可能在未來的時間。

我假設你正在導出類和重載函數。如果你不是,那麼我會用C名字來導出函數。這些名字不會被破壞,也不會改變。

+0

我確實在出口類。他們希望使用'.def'文件來「隱藏」函數名稱,並使用序數代替(以防止用戶猜測導出哪些函數......)我相信這是一個可怕的原因,它不會阻止任何天才「黑客」找到功能簽名。 – ereOn 2011-01-05 19:08:16

+0

哎。那麼,我會嘗試在構建過程中自動化它。創建一個使用__declspec()的單獨構建解決方案(隱藏在一個在常規構建中無法展開的宏中)。在輸出上運行dumpbin,並根據dumpbin結果創建一個.def文件,並將其合併到項目中。這樣它就相當自動化了,如果你切換到不同的編譯器就不會炸掉。你只需要記住使用宏。 – 2011-01-05 20:03:24

+0

我不明白關於引入DEF文件問題的名稱修改方案更改的評論背後的推理。我認爲DEF文件是一種避免命名重寫更改問題的方法,因爲當您使用dllexport時,會得到重名的名稱,但是當您使用DEF文件時,您可以指定名稱,並且它們會進入未被重定向的出口我的經驗。 – BlueMonkMN 2017-05-03 15:38:51