2011-04-18 38 views
0

是否可以使用特定錯位名稱從C++ Builder DLL中導出函數?
我正在嘗試構建一個C++ Builder DLL來替換現有的VC++ DLL。問題是使用該DLL的應用程序期望其中一個函數具有特定的錯位名稱。如何強制使用VC++名稱修改C++ Builder?

也就是說,它預計要調用的函數:

"[email protected]@[email protected]@[email protected]@@Z" 

當然,我可以從我的DLL導出函數有錯位的名字,但CodeGear公司堅持使用自己的名稱重整方案。

是否有可能迫使C++ Builder來:

  1. 的功能使用特定的重整名稱?

  2. 使用VC++名稱mangling來實現特定功能嗎?

請注意,我只想更改特定函數的mangling,而不是DLL中的所有函數。

回答

2

名稱改變只是ABI許多方面的一個。事實上,這將是更容易標準化。當編譯器使用不同的ABI時,編譯器會使用有目的的不同名稱集合來防止鏈接不兼容的對象。

您可能會嘗試給定函數的一件事是將其標記爲extern "C",然後它將使用C的調用約定和相同的調整(通常不會改變或僅僅是初始的_)。很明顯,這不會處理其他問題(處理異常,vtbls的精確內容,哪些寄存器用於傳遞參數,標準庫的準確定義,...)

+0

我的理解是,使用'extern「C」'將停止被破壞的函數名稱,我真的希望它以某種方式被破壞。
我CodeGear允許開發人員導出具有特定名稱的函數,但我只有這樣才能使用簡單的導出名稱,而不是複雜的字符。我想知道是否有其他人能夠得到這個工作。 – Hoppy 2011-04-18 06:51:37

+0

+1,這裏的損壞是爲了保護你免受不兼容的ABI的傷害。你應該首先找出哪個VC++ ABI是你的目標,IIRC VC-2005之前的ABI與VC2005及之後的ABI不兼容。 – MSalters 2011-04-18 07:54:55

2

使用.def文件指定您自己的導出函數的命名。

+0

謝謝雷米。不幸的是,這似乎只適用於簡單的名字。當我試圖做一個長時間的,錯位的函數名稱時,鏈接器會拋出一個錯誤。不過,作爲唯一一個試圖回答我問的問題的人+1。 – Hoppy 2011-04-20 06:57:34