2012-01-22 52 views
0

不幸的是,由於某種原因,我無法理解,我一直無法windbg承認我的擴展。不能得到windbg識別我的擴展

#ifndef EXPT_API 
#define EXPT_API __declspec(dllexport) 
#endif 

extern "C" EXPT_API HRESULT CALLBACK help(PDEBUG_CLIENT Client, PCSTR args) 
{ 
    IDebugControl* Control; 
    IDebugSymbols* Symbols; 

    DebugCreate(__uuidof(IDebugClient),(void **)&Client); 
    Client->QueryInterface(__uuidof(IDebugControl), (void **)&Control); 
    Client->QueryInterface(__uuidof(IDebugSymbols), (void **)&Symbols); 

    // TODO: Extension code goes here: 

    Control->Output(DEBUG_OUTPUT_NORMAL, "A sample help message."); 

    return S_OK; 
} 

這一切編譯罰款,但每當我試圖加載從WinDbg的擴展,我得到這個:

!Extension.help 
No export help found 

我我的.dll文件加載成IDA Pro的自由,並期待在出口,那裏是:「幫助」。我一直試圖弄清楚這幾個小時。任何幫助你可以提供將非常感激。非常感謝。

+1

你看在所依賴的DLL?即使使用extern「C」,一些調用約定也會輕微地改變名稱。 – Benj

+0

非常感謝!你真了不起!它將我的「幫助」轉換爲「_help @ 8」。你有什麼想法如何解決這個問題? .def文件會訣竅!?謝謝,非常感謝!編輯:如果您將其轉換爲答案,我會接受並註冊它:p – niemiro

+1

是的,.def文件通常是答案。 – Benj

回答

1

您可能會使用stdcall調用約定,即使使用extern「C」也會導致名稱變形。如果你使用的是cdecl,情況就不一樣了。如果你遵循編寫WinDBG擴展的標準方法,那麼你可能需要stdcall,所以解決name mangling問題的最好方法是使用.def文件,它可以讓你根據你的需要調用導出。

見一個很好的破敗這先前的問題上的細微之處:

__cdecl or __stdcall on Windows?

+0

非常感謝您的幫助。 .def文件已經很好地解決了這個問題。另外,感謝您的鏈接。雖然看起來__cdecl用下劃線裝飾函數名,但我學到了很多。再次感謝! – niemiro

相關問題