#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endifEXPORT BOOL CALLBACK installHook(BOOL bInstall);
dll中是这样定义的,为什么用dependency walker看到的导出函数名是:
_installHook@4(也要使用这个来GetProcAddress)
怎么才能使它是installHook呢?另外我的DllMain是这样的
int WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, PVOID pvReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
installHook(TRUE);
break;
case DLL_PROCESS_DETACH:
installHook(FALSE);
break;
default:
break;
}
return TRUE;
}
为什么不能在LoadLibrary的时候自己installHook呢?
非得要在load之后自己用GetProcAddress取得函数地址后执行一次才行呢?

解决方案 »

  1.   

    增加文本文件demo.def LIBRARY Demo 
    EXPORTS 
    installHook @1 
    Demo 是你DLL文件名
      

  2.   

    如一楼所说,或者
    把CALLBACK 改成_cdecl
      

  3.   

    #define CALLBACK    __stdcall
    CALLLBACK是这样定义的
    、_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。 
      

  4.   

    bluebohe(薄荷) 说的很正确,我只能解释一下了~
    _installHook@4实际上是编译器“看到”的函数名,你导出的时候,还是可以使用你原来定义的函数名。另外,不能在LoadLibrary的时候自己installHook,原因是dll并没有自己的堆栈空间,它只能使用主调的堆栈,所以没有系统资源供其执行installHook这个函数。打个比方,可以说dll没有自己的“家”,它只能“寄居”。
      

  5.   

    楼上的,我导出的时候不能使用installHook,只能用_installHook@4来GetProcAddress啊!那要怎么来使它能够在LoadLibrary的时候自己installHook呢?
      

  6.   

    up一下,就是说def是另外一种导出方式,导出的函数名是可以自己决定的!