Найти в Дзене

Всемогущий CMD.EXE и использование консольных комманд Windows в Delphi 12.1

Сказать по правде, в планах было написание статьи совсем на другую тему, а именно анонс обновления софта для 5D/7D/VR, но занимаясь этим самым обновлением обнаружил интересный момент в работе с командами консоли, с которым прежде не сталкивался... Кто-то может сказать, мол, ну а что ж тут сложного? Юзай winexec и будет тебе счастье! Да, но это годится только для простых задач, когда надо выполнить действие, не контролируя его исполнение и без намерений получить какой-либо результат... И тут уж нам никак не обойтись без нашего любимого CreateProcess и WaitForSingleObject... Ну а если уж надо получить результат выполнения, то надо позаботиться о том, чтобы сделать вывод в файл, указав его Handle в поле hStdOutput структуры TStartupInfo... И все казалось бы хорошо и просто... и так собственно и было до какого-то момента... Может, кто-то столкнулся раньше, и, может, дело не в версии среды, но... НО! Описанный выше код, стал в runtime валить "Access violation at address" При этом, исправн

Сказать по правде, в планах было написание статьи совсем на другую тему, а именно анонс обновления софта для 5D/7D/VR, но занимаясь этим самым обновлением обнаружил интересный момент в работе с командами консоли, с которым прежде не сталкивался...

Кто-то может сказать, мол, ну а что ж тут сложного? Юзай winexec и будет тебе счастье! Да, но это годится только для простых задач, когда надо выполнить действие, не контролируя его исполнение и без намерений получить какой-либо результат...

Пример использования winexec для перезапуска системы
Пример использования winexec для перезапуска системы

И тут уж нам никак не обойтись без нашего любимого CreateProcess и WaitForSingleObject... Ну а если уж надо получить результат выполнения, то надо позаботиться о том, чтобы сделать вывод в файл, указав его Handle в поле hStdOutput структуры TStartupInfo...

-2

И все казалось бы хорошо и просто... и так собственно и было до какого-то момента... Может, кто-то столкнулся раньше, и, может, дело не в версии среды, но... НО! Описанный выше код, стал в runtime валить "Access violation at address"

При этом, исправно работая в том случае, если команда содержала путь к исполняемому файлу или сценарию... При этом явное указание исполняемого файла команды и указания параметров приводили к ровно тому же результату...

Следуя логике и вспомнив о том, что такое "командный процессор" (славься великий command.com) перестроил вызов именно на него (cmd.exe) родимого!

-3

Хочу так же обратить внимание, что несмотря на указанную в TStartupInfo wShowWindow := SW_HIDE черный квадрат консоли мерзко промаргивал. Потом в dwCreationFlags явно указано CREATE_NO_WINDOW.

А что же с перехватом результатов исполнения?

А тут стало еще проще!

-4

То есть указываем команду именно так, как если бы мы реально использовали консоль...

-5

Собственно, пример показывает получение информации о сетевой статистике на уровне отправленных\принятых пакетов.

Как то так... Как говорит мой отец: век живи - век учись, а дураком помрешь!