我有一个导出函数的 DLL:
__declspec(dllexport)
void __stdcall MyEntryPoint(char* params)
{
MessageBoxA("MyEntryPoint",params,0,0);
}
如何使用 rundll32.exe 加载我的 DLL 并调用MyEntryPoint()
?
您需要定义一个具有非常特定签名的函数,以便它可以被 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,其中详细说明了每个参数的预期内容等。