我有一个导出函数的DLL:
__declspec(dllexport)
void __stdcall MyEntryPoint(char* params)
{
MessageBoxA("MyEntryPoint",params,0,0);
}
如何使用rundll32.exe加载我的DLL并调用MyEntryPoint()
?
答案 0 :(得分:9)
您需要定义一个具有非常特定签名的函数,以便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
函数,如果发现调用,则区别在于Unicode pszCmdLine
参数。
有关如何使用rundll32
的更多信息,请查看MSDN,其中详细说明了对每个参数的期望等。