Форум программистов, компьютерный форум, киберфорум
nekit270
Войти
Регистрация
Восстановить пароль
Добро пожаловать, здесь я программирую бессмысленно и беспощадно

Вызов функций из DLL через командную строку

Запись от nekit270 размещена 30.10.2023 в 22:08
Показов 4393 Комментарии 2
Метки bat, batch, cmd, dll, rundll32, rundll34, windows

Стандартные DLL винды (kernel32.dll, user32.dll, shell32.dll и другие) содержат огромное количество полезных (или просто интересных) функций.

В поставку винды входит замечательная утилита rundll32, которая открывает двери в мир WinAPI. Вернее, приоткрывает, потому что имеет она очень серьезный недостаток - она умеет вызывать функции только с определенной сигнатурой, а именно:
Code
1
void CALLBACK EntryPoint(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow);
И третим аргументом (lpszCmdLine) в функцию передается все, что при вызове rundll32 было после имени функции:
Windows Batch file
1
rundll32 foo.dll,Bar a b c d
Этот пример вызовет из foo.dll функцию Bar, в lpszCmdLine которой передаст строку "a b c d".

Но проблема в том, что большинство (если не все) функции WinAPI имеют другую сигнатуру, и при вызове через rundll32 либо не будут работать вообще, либо будут работать некорректно, либо, в лучшем случае, что-нибудь функция сделает, но настроить это не получится.

Вот отличный пример: я хочу показать окно сообщения, используя функцию MessageBoxA. Я использую следующую команду:
Windows Batch file
1
rundll32 user32.dll,MessageBoxA test
Но поскольку сигнатура функции MessageBoxA не соответствует той, которую ожидает rundll32, результат будет непредсказуемым.

У меня выполнение этой команды выдало вот такое окно:
Нажмите на изображение для увеличения
Название: msgbox1.png
Просмотров: 353
Размер:	6.8 Кб
ID:	8341

Но что, если я хочу вызывать функции нормально (а желательно еще и получать результат)?
Тут есть три варианта:
  1. Написать небольшую программу (на C, C++, C#, Python, в общем на всем, где есть вызов внешних функций), которая будет вызывать одну функцию и передавать ей аргументы из командной строки
  2. Написать на C/C++ DLL, которая будет парсить lpszCmdLine, и вызывать ее через rundll32
  3. Создать аналог rundll32 с поддержкой любых сигнатур

Варианты идут в порядке увеличения сложности и универсальности, а поскольку я не ищу легких путей, то был выбран третий вариант

В итоге получилась маленькая утилита, вполне сносно выполняющая свои функции. Ссылка на GitHub (бинарь, исходники, доки)

Документация есть на GitHub, но кратко приведу ее здесь:
Windows Batch file
1
rundll34 <название dll> <название функции> <тип возврата> <аргументы>
Название DLL - либо полный путь, либо только имя файла, если такая DLL есть в %PATH%.

Название функции чувствительно к регистру. Обратите внимание, что если функция имеет две версии - например MessageBoxA и MessageBoxW, то нужно указать, какую именно использовать.
Вместо названия может использоваться порядковый номер (ординал) функции с префиксом "#".

Тип возврата (как и аргументов) может быть:
  • Любым из предопределенных значений: byte, int, uint, long, ulong, double, intptr, char, string
    intptr - указатель, char - одиночный символ, string - строка
  • Любым типом .NET (System.Int32, System.Single, ...)
  • null - нулевой указатель, аналогично intptr:0 (только для аргументов)
  • void - отсутствует возвращаемое значение (только для типа возврата)

Аргументы передаются в формате тип:значение.

Пример:
Windows Batch file
1
rundll34 user32.dll MessageBoxA int null string:"Hello!" string:"test" int:64
Выплюнет такое окошко:
Название: msgbox2.png
Просмотров: 2858

Размер: 7.7 Кб

На этом все, в следующей статье расскажу про некоторые полезные (и просто интересные) функции, которые находятся в стандартных библиотеках винды.
Метки bat, batch, cmd, dll, rundll32, rundll34, windows
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
  1. Старый комментарий
    пардон. немного не в тему. пощелкал по bcwd. Интересно. Вы не планируете про него рассказать?
    Запись от sqltd1 размещена 31.10.2023 в 17:18 sqltd1 вне форума
  2. Старый комментарий
    Аватар для nekit270
    Цитата Сообщение от sqltd1
    Вы не планируете про него рассказать?
    Планирую, но только после написания документации к нему, которая сейчас находится в зачаточном состоянии (у меня плохая привычка - сначала делать все и сразу, а написание документации откладывать)

    После статьи о функциях из DLL планирую написать несколько про wesh (он тоже на github есть), и параллельно писать доки к bcwd.
    Запись от nekit270 размещена 31.10.2023 в 17:55 nekit270 вне форума
 
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru