在不知道函数可以接受的参数数量/类型的情况下,RunDll32究竟是如何调用函数的?
它有没有内置的编译器或类似的东西?
发布于 2011-11-21 13:21:37
RunDll32非常简单,它调用LoadLibrary来加载给定的DLL,调用GetProcAddress来获取所需函数的函数地址,然后调用该函数。
但是,它不能调用DLL中的任何导出函数-它假定该函数具有以下非常特定的函数签名:
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);其中,CALLBACK是扩展到__stdcall调用约定的宏。有关详细说明,请参阅this knowledge base article。
如果您的DLL函数没有正确的签名或调用约定,就会出现许多不好的情况。有关更多血淋淋的细节,请参阅What can go wrong when you mismatch the calling convention?。幸运的(或不幸的),RunDll32 is written in such a way to ameliorate those types of errors,但这仍然不意味着它是一个好主意。请勿使用RunDll32调用没有正确签名的函数。这只是一颗定时炸弹,等待着在下一版本的Windows中爆炸。
发布于 2011-11-21 13:13:45
它不能调用任何函数,它只能调用函数specifically written to be called。因此,没有魔法。
https://stackoverflow.com/questions/8207510
复制相似问题