使用Rundll32.exe执行DLL导出的函数

时间:2012-02-01 12:56:41

标签: c winapi dll rundll32

我有一个导出函数的DLL:

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

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

1 个答案:

答案 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,其中详细说明了对每个参数的期望等。