为什么伦德尔缺少进入?

时间:2014-07-26 11:23:51

标签: c++ winapi dll

我在Visual Studio 2010中创建了一个简单的DLL,这是一个DLL类型的win32项目。

然后我将DllMain更改为:

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        MessageBox(0,L"Hey there!",0,0);
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

我使用rundll32 vahid-win32.dll,dllmain来运行它。消息框显示,但之后它给出了

  

vahid-win32.dll错误

     

缺少参赛作品:dllmain

我的DLL出了什么问题?还是和我在一起? : - )

提前致谢

2 个答案:

答案 0 :(得分:3)

您的留言箱并非来自您传递DllMain功能名称。而是自动调用它。但Rundll32正在寻找一个名为DllMain的导出函数,其中包含dllexport声明,如下所示。

BOOL APIENTRY DllMain( HMODULE hModule,
                   DWORD  ul_reason_for_call,
                   LPVOID lpReserved
                 )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
    MessageBox(0,L"Hey there!",0,0);
    break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
    break;
}
return TRUE;
}

extern "C" __declspec(dllexport) void mydllmain()
{
   MessageBox(0,L"Hey there again!",0,0);
}

当您使用参数mydllmain调用RunDll32时,它会给出两个消息框,但没有错误。

答案 1 :(得分:1)

没有理由通过DllMain拨打RunDLL,加载DLL时会自动调用{{1}}。 而是尝试运行自定义功能。 除此之外,问题可能是导出的名称。您需要为DLL编写.def文件。

DllMain它始终是自动引起的。它会导致通过rundll32,它会被引起,为此目的它是#34;入口点",你反复试图引起它。