Как работает 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.

Он не может вызывать какую-либо функцию, он может вызывать только функцию, специально написанную для вызова. Следовательно, нет волшебства.

Другие вопросы по тегам