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/