我有一个导出函数的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,它详细说明了每个参数的期望值等。