8

How exactly does RunDll32 call a function, without knowing the number/types of arguments that the function can take?

Does it have a built-in compiler or something of the sort?

4

2 回答 2

14

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

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

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

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

如果您的 DLL 函数没有正确的签名或调用约定,则会出现很多错误。请参阅不匹配调用约定时会出现什么问题?很多血淋淋的细节。幸运的是(或者不幸的是),RunDll32 的编写方式可以改善这些类型的错误,但这并不意味着它是一个好主意。 不要使用 RunDll32 调用没有正确签名的函数。这只是一颗等待在下一版 Windows 中引爆的定时炸弹。

于 2011-11-21T05:21:36.690 回答
2

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

于 2011-11-21T05:13:45.353 回答