2012-01-22 22 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

相关问题