Вам нужно определить функцию с очень специфической сигнатурой, чтобы она могла вызываться rundll32. Посмотрите эту запись в блоге для получения информации, которая включает подробности о том, как и почему вы можете получить сбои.
Кроме того, посмотрите на этот ответ на аналогичный вопрос, где подробно описана сигнатура функции.
В сущности, чтобы ваша функция была безопасна для вызова, ее необходимо определить примерно так:
void CALLBACK MyEntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR pszCmdLine, int nCmdShow);
или
void CALLBACK MyEntryPointW(HWND hwnd, HINSTANCE hinst, LPWSTR pszCmdLine, int nCmdShow);
Все остальное повредит стек и может (или не может) вызвать сбой. Я думаю, что в более поздних версиях Windows, rundll сначала будет искать функцию MyEntryPointW
, и, если найден вызов, - разница в параметре Unicode pszCmdLine
.
Для получения дополнительной информации о том, как использовать rundll32
, посмотрите MSDN , в котором подробно описано, что ожидать для каждого из параметров и т. Д.