RunDll32如何工作?

时间:2011-11-21 05:05:15

标签: c rundll32

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

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

2 个答案:

答案 0 :(得分:12)

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中出现。

答案 1 :(得分:2)

它不能只调用任何函数,它只能调用函数specifically written to be called。因此,没有魔力。