RunDll32在不知道函数可以使用的参数数量/类型的情况下如何精确调用函数?

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

最佳答案

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中启动。

关于c - RunDll32如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8207510/

10-11 23:14