RunDLL32不执行任何操作

时间:2020-10-12 21:50:47

标签: c++ visual-studio dll

我正在尝试创建一个可以通过RunDLL32执行的DLL。我知道RunDLL32运行正常,因为如果执行以下命令,它将弹出一个消息框: rundll32 printui.dll,PrintUIEntry /。 但是我不能让它执行我创建的DLL,如下所示:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"


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

代码可以正常编译(在Visual Studio 2017中,发布模式为x64),但是当我执行时

RunDLL32 MyDLL.dll

什么都没发生。没有错误消息,没有输出,也没有消息框。为什么呢?

1 个答案:

答案 0 :(得分:2)

由于您正在编译64位DLL,因此请确保您正在运行RunDll32的64位版本:

rundll32.exe equivalent for 64-bit DLLs

this page

如果将错误类型的DLL传递给Rundll32,它可能无法运行而不返回任何错误消息。

即使您可以获得RunDLL32来加载DLL you can't safely call MessageBox() in DllMain() at all

除了DllMain外,您还需要export a function for RunDLL32 to execute。您可以在该函数中调用MessageBox(),例如:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "pch.h"

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

extern "C" __declspec(dllexport) void CALLBACK MyFunctionW(HWND hwnd, HINSTANCE hinst, LPWSTR lpszCmdLine, int nCmdShow)
{
    MessageBoxW(hwnd, lpszCmdLine, L"Hello", MB_OK);
}
rundll32 my.dll,MyFunction "hello world"