我有一个导出函数的dll:

__declspec(dllexport)
void __stdcall MyEntryPoint(char* params)
{
    MessageBoxA("MyEntryPoint",params,0,0);
}

如何使用rundll32.exe加载我的dll并调用MyEntryPoint()

最佳答案

您需要定义一个具有非常特定签名的函数,以便rundll32可以调用它。查看this blog entry以获取信息,其中包括有关如何和为什么可能发生崩溃的详细信息。
另外,请看一个类似的问题this answer,其中函数的签名是详细的。
基本上,要使函数能够安全地调用,需要将其定义为:

void CALLBACK MyEntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR pszCmdLine, int nCmdShow);


void CALLBACK MyEntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR pszCmdLine, int nCmdShow);

其他任何东西都会损坏堆栈,并可能(或可能不会)导致崩溃。我认为在以后的windows版本中,rundll将首先查找MyEntryPointW函数,如果找到则调用该函数-区别在于unicodepszCmdLine参数。
有关如何使用rundll32的更多信息,请查看MSDN,它详细说明了每个参数的期望值等。

09-17 23:30