RunDll32如何工作?

RunDll32究竟如何调用函数,而不知道函数可以采用的参数的数量/类型?

它是否有内置的编译器或类似的东西?

RunDll32几乎是一个瘦的包装器,它调用LoadLibrary来加载给定的DLL,调用GetProcAddress来获取所需函数的函数地址,然后调用该函数。

它不能只调用DLL中的任何导出函数,但它假定该函数具有以下特定的函数签名:

  void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); 

其中CALLBACK是一个扩展为__stdcall调用约定的宏。 有关更详细的说明,请参阅此知识库文章 。

如果你的DLL函数没有正确的签名或调用约定,那么就会出现很多不良内容。 看看当你不匹配调用约定时会出现什么问题? 对于许多血腥细节。 幸运的是(或者可能不幸的是), RunDll32是以改善这些类型的错误的方式编写的 ,但这并不意味着它是个好主意。 不要使用RunDll32来调用没有正确签名的函数 。 这只是一个滴答作响的定时炸弹等待在下一个版本的Windows中出现。

它不能只调用任何函数,它只能调用专门编写的函数来调用 。 因此,没有魔力。