【发布时间】:2012-02-24 03:43:12
【问题描述】:
我有一个导出函数的 DLL:
__declspec(dllexport)
void __stdcall MyEntryPoint(char* params)
{
MessageBoxA("MyEntryPoint",params,0,0);
}
如何使用 rundll32.exe 加载我的 DLL 并调用MyEntryPoint()?
【问题讨论】:
我有一个导出函数的 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 函数,如果找到则调用该函数 - 区别在于 Unicode pszCmdLine 参数。
有关如何使用rundll32 的更多信息,请查看MSDN,其中详细说明了每个参数的预期内容等。
【讨论】: