Используйте Rundll32.exe для выполнения функции, экспортируемой DLL - PullRequest
4 голосов
/ 01 февраля 2012

У меня есть DLL, которая экспортирует функцию:

__declspec(dllexport) 
void __stdcall MyEntryPoint(char* params)
{
    MessageBoxA("MyEntryPoint",params,0,0);
}

Как я могу использовать rundll32.exe для загрузки моей DLL и вызвать MyEntryPoint()?

1 Ответ

9 голосов
/ 01 февраля 2012

Вам нужно определить функцию с очень специфической сигнатурой, чтобы она могла вызываться 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 , в котором подробно описано, что ожидать для каждого из параметров и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...