RunDll32 в значительной степени является тонкой оболочкой, которая вызывает LoadLibrary
для загрузки заданной DLL, вызывает GetProcAddress
, чтобы получить адрес функции нужной функции, а затем вызывает функция.
Он не может вызывать любую экспортируемую функцию в DLL, хотя предполагает, что функция имеет очень специфическую сигнатуру функции:
void CALLBACK
EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
где CALLBACK
- макрос, который расширяется до __stdcall
соглашения о вызовах. См. эту статью базы знаний для более подробного описания.
Если функция вашей DLL не имеет правильной подписи или соглашения о вызовах, это может привести к серьезным последствиям. См. Что может пойти не так, если вы не соответствуете соглашению о вызовах? для получения многих подробностей. К счастью (или, возможно, к сожалению), RunDll32 написан таким образом, чтобы уменьшить количество ошибок такого типа , но это все равно не означает, что это хорошая идея. Не используйте RunDll32 для вызова функций, которые не имеют правильной подписи . Это просто бомба замедленного действия, ожидающая взрыва в следующей версии Windows.