4

我有一个导出函数的 DLL:

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

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

4

1 回答 1

10

您需要定义一个具有非常特定签名的函数,以便它可以被 rundll32 调用。查看此博客条目以获取信息,其中包括有关如何以及为什么会发生崩溃的详细信息。

另外,请查看此对类似问题的答案,其中详细说明了函数的签名。

本质上,为了让您的函数可以安全地调用,它需要被定义为:

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,其中详细说明了每个参数的预期内容等。

于 2012-02-01T13:04:11.100 回答