2014-03-26 105 views
0

我正在處理一個包含函數DLLEXPORT void* GetBase(HANDLE hProc)的DLL,當我編譯它時,我用Dependency Walker打開它,並且沒有名稱爲「GetBase」的函數。我只能看到「?GetBase @@ YAPAXPAX @ Z」。這有什麼問題?我正在使用Visual C++ 2013,並將其編譯爲版本。DLL壞功能名稱

+0

您正在將代碼構建爲C++。文件擴展名是.cpp還是.c? – cup

+0

文件擴展名是「.cpp」。 –

+1

這是完全正常的,C++編譯器將*裝飾*函數名稱。必要的,以便重載的方法將有不同的鏈接名稱。使用'extern「C」'來禁止它。不要壓制它,當你改變函數聲明並且不更新使用它的代碼時,這是避免麻煩的好方法。 –

回答

0

你的功能沒有什麼「錯誤」。它已經「被打亂」了;換句話說,編譯器爲你的函數名添加了類型信息。這就是C++如何支持重載:具有相同名稱但採用不同參數的函數將具有不同的損壞函數名稱。

您的DLL可能也有debug info attached,這可能是另一個名稱混亂的來源。

說了這麼多,你問題上的「c」標籤很麻煩; C沒有超載,因此不需要改名。