2014-01-11 35 views
0

我這是寫在2003 VS庫代碼,C++ 7.1如何禁用C++ 7.1名稱修改? :(

我設法編譯在VS 2010現在我需要編譯它在VS2003爲好。

問題是我不能阻止VS2003名字改編!

我用__declspec(dllexport)的__stdcall之前函數的名字,我也把外部的「C」塊碼。

我仍然得到錯位的函數名,當我在編譯VS 20003.我不需要一個.def文件使用__declspec(dllexport)對不對?

熙是代碼:

extern "C" 
{ 

    void __declspec(dllexport) __stdcall FreeMyObject(MyObjectHandle pObj) 
    { 
    delete pObj; 
    } 
} 

而且 「呼喚公約」 是__cdecl(/ Gd)的

爲什麼我得到錯位的函數名?有沒有我需要在編譯器選項中設置的選項?

+1

它將被裝飾爲_FreeMyObject @ 4,stdcall裝飾。與C++的名字不一樣。它與C不兼容。如果你想重命名它,那麼你必須使用一個.def文件。 –

+0

謝謝你,yest似乎是因爲stdcall。所以編譯器在VS2010中表現不同?因爲它的工作正常,沒有def文件。謝謝你的回答:) – QProgrammer

+1

很長很長時間以來一直這樣。 VS2010沒什麼不同。唯一合理的猜測是,您正在VS2010項目中構建64位代碼。這不需要名稱裝飾,只有一個調用約定。你不會留下任何其他的東西來猜測。 –

回答

1

關鍵字_stdcall以及_cdecl,_thiscall等都是調用約定,指定編譯器如何處理推送和彈出參數以及返回值。用_stdcall(至少在visual studio中)製作的函數名在導出時是「裝飾的」。如果要查找導出的函數名稱,可以使用visual studio命令行函數DUMPBIN /EXPORTS "DLL file location"。你的函數名可能看起來像這樣:[email protected](some number)。您也可以使用.def文件並自己定義名稱,但我個人認爲這很痛苦。