Ada*_*eld 12
RunDll32几乎是一个瘦的包装器,它调用LoadLibrary
加载给定的DLL,调用GetProcAddress
获取所需函数的函数地址,然后调用该函数.
它不能只调用DLL中的任何导出函数,但它假定该函数具有以下特定的函数签名:
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
Run Code Online (Sandbox Code Playgroud)
其中CALLBACK
是一个扩展为__stdcall
调用约定的宏.有关更详细的说明,请参阅此知识库文章.
如果你的DLL函数没有正确的签名或调用约定,那么就会产生很多不良后果.看看当你不匹配调用约定时会出现什么问题?对于许多血腥细节.幸运的是(或者可能不幸的是),RunDll32是以改善这些类型的错误的方式编写的,但这并不意味着它是个好主意. 不要使用RunDll32来调用没有正确签名的函数.这只是一个滴答作响的定时炸弹等待在下一个版本的Windows中发布.