2012-02-01 61 views
4

导出函数我有一个导出函数的DLL:使用的Rundll32.exe执行的DLL通过

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

如何使用RUNDLL32.EXE加载我的DLL并调用MyEntryPoint()

回答

8

您需要定义一个具有非常特定的签名的函数,以便它可以被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,里面详细介绍什么期望每个参数的等

+1

非常感谢..我应该已经看到,高达 – CnativeFreak 2012-02-01 13:08:45