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