Как работает RunDll32?

Как именно RunDll32 вызывает функцию, не зная количества / типов аргументов, которые может выполнять функция?

Есть ли у него встроенный компилятор или что-то в этом роде?

    RunDll32 – довольно тонкая shell, которая вызывает LoadLibrary для загрузки данной DLL, вызывает GetProcAddress чтобы получить адрес функции желаемой функции, а затем вызывает функцию.

    Он не может вызывать только какую-либо экспортированную функцию в DLL, но предполагает, что функция имеет очень специфическую сигнатуру функции из следующего:

      void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow); 

    где CALLBACK – это макрос, который расширяется до __stdcall вызове __stdcall . См. Эту статью базы знаний для более подробного описания.

    Если ваша функция DLL не имеет правильной подписи или соглашения о вызове, произойдет множество неприятностей. См. Что может пойти не так, когда вы не согласны с вызывающим соглашением? для множества подробностей. К счастью (или, возможно, к сожалению), RunDll32 написан таким образом, чтобы улучшить эти типы ошибок , но это все еще не означает, что это хорошая идея. Не используйте RunDll32 для вызова функций, которые не имеют правильной подписи . Это просто тикающая бомба замедленного действия, ожидающая выхода в следующей версии Windows.

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