DLL导出函数称为两次

时间:2016-09-07 04:18:21

标签: c dll

我制作了一个简短的DLL,它会在进程加载时显示MessageBox。但是,消息框显示两次。因此,看起来DLL导出函数被调用两次。您能否查看我的代码中是否有需要修改的内容,以便MessageBox只显示一次?

rundll32 "path to DLL",sampledllmain

我使用rundll32加载DLL,如下所示:

WebDriver

1 个答案:

答案 0 :(得分:2)

information page about rundll32.exe

所述
  
      
  1. 它通过LoadLibrary()加载指定的DLL。
  2.   
  3. 它通过GetProcAddress()获取功能的地址。
  4.   
  5. 它调用该函数,传递命令行尾部,即。
  6.   

在你的情况下:

  1. 调用LoadLibrary()时,会调用DllMain,在您的情况下DllMain调用sampledllmain
  2. 获取sampledllmain
  3. 的地址
  4. 致电sampledllmain(第二次)。
  5. 解决您的问题:

    • 添加第二个函数dummy(例如)
    • 在命令行上使用rundll32 "path to DLL",dummy

    PS:在附加说明中,您还可以调试您的dll guides that describe how to do it

    MessageBox

    中调用dllMain的示例
    #include <windows.h>
    __declspec(dllexport) void sample(void)
    {
        MessageBox(NULL, "sample text test", "sample title test", 0);
    }
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
            MessageBox(NULL, "attach", "DllMain", 0);
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            MessageBox(NULL, "detach", "DllMain", 0);
            break;
        }
        return TRUE;
    }
    

    使用rundll32.exe lib.dll,sample

    运行