RunDll32如何调用函数,却不知道函数可以接收的参数数量及类型?
它是否有内置编译器或类似工具?
RunDll32实际上是一个薄包装,它调用LoadLibrary
来加载给定的DLL,调用GetProcAddress
来获取所需函数的函数地址,然后调用该函数。
但是它不能调用DLL中的任何导出函数-它假定该函数具有以下非常特定的函数签名:
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
其中CALLBACK
是一个宏,扩展为__stdcall
调用约定。详情请参见这篇知识库文章。
如果你的DLL函数没有正确的签名或调用约定,将会产生许多问题。请参见当你不匹配调用约定时会出现哪些问题?获取更多详细信息。幸运的是(或者也许不幸的是),RunDll32的编写方式使这些类型的错误得到缓解,但这仍然意味着这是一个不好的主意。不要使用RunDll32来调用没有正确签名的函数。这只是一个时限炸弹,等待在下一版Windows中爆炸。
它不能调用任何函数,只能调用专门编写的可被调用的函数。因此,这并不神奇。