В данном запросе пользователь столкнулся с проблемой запуска утилиты OpenFiles.exe из среды разработки Delphi XE2 для экспорта списка открытых файлов в текстовый файл. Проблема заключается в том, что, несмотря на успешное выполнение команды, файл с результатами не создается. Пользователь пытался решить проблему, запуская OpenFiles.exe напрямую и через скрипт .bat, но в обоих случаях, когда команда выполнялась из Delphi, файл создавался, но оставался пустым. В качестве альтернативного ответа предложено использовать командный интерпретатор cmd.exe для выполнения команды или же использовать функцию CreateProcess для запуска процесса с перенаправлением вывода в файл.
Решение проблемы с запуском OpenFiles.exe в Delphi XE2 и экспортом списка файлов
Введение
OpenFiles.exe — это утилита в операционной системе Windows, предназначенная для запроса списка открытых файлов на рабочей станции. В данной статье мы рассмотрим, как правильно использовать эту утилиту из приложения, разработанного в среде Delphi XE2, для экспорта списка открытых файлов в текстовый файл.
Проблема
При попытке запустить OpenFiles.exe из Delphi XE2 с использованием функции ShellExecute, файл с результатами не создается. Пользователь уже пытался решить проблему, изменяя параметры запуска и даже перенаправляя вывод в файл через скрипт .bat, но без успеха.
Пример кода
Пример кода, предоставленный пользователем, возвращает успешный код завершения процесса, но файл с результатами остается пустым. Это может быть связано с неправильным перенаправлением вывода, поскольку прямой вызов OpenFiles.exe не включает в себя механизм обработки командной строки.
Предложенное решение
В альтернативном ответе предложено два варианта решения проблемы:
1. Вызвать ShellExecuteEx, передав в качестве параметра командный интерпретатор cmd.exe, который выполнит необходимую работу.
2. Использовать CreateProcess для запуска другого процесса, но передать в него дескриптор файла в качестве дескриптора стандартного вывода для нового процесса.
Пример с использованием cmd.exe
FillChar(exInfo, SizeOf(exInfo), 0);
with exInfo do
begin
cbSize := SizeOf(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
lpFile := 'cmd.exe';
lpParameters := '/c Openfiles.exe /query /s 127.0.0.1 /nh >c:\OpenFilesExport.txt';
nShow := SW_SHOWNORMAL;
end;
Важные замечания
Проблема с перенаправлением вывода (>) требует использования командного интерпретатора.
При использовании CreateProcess необходимо создать файл с помощью CreateFile и передать его дескриптор как дескриптор стандартного вывода для нового процесса, а также убедиться, что дескриптор файла наследуем.
Важно дождаться завершения процесса, чтобы корректно закрыть дескриптор файла.
Текущий цикл ожидания в примере пользователя является неэффективным и может привести к избыточному потреблению ЦП.
Заключение
Пользователь уже испытал на практике вариант с использованием cmd.exe, но столкнулся с проблемой создания файла нулевого размера. Возможна проблема совместимости 32/64 бит, особенно если родительский процесс является 32-битным. Также рекомендуется избегать размещения файлов в системном каталоге, что может быть причиной возникновения ошибок.
Обратите внимание
Пользователь подчеркнул, что OpenFiles.exe является консольным приложением, расположенным в каталоге Windows\System32, и что при использовании других консольных приложений с предложенным кодом проблемы не возникает.
Рекомендации по дальнейшим действиям
Проверить версию OpenFiles.exe, совместимую с разрядностью родительского процесса.
Переместить скрипты и утилиты в другой каталог, исключая системный.
Провести дополнительное тестирование и отладку кода для выявления и устранения возможных ошибок.
Эта статья предоставляет обзор проблемы и рекомендуемые решения для запуска OpenFiles.exe из Delphi XE2 и экспорта списка открытых файлов в текстовый файл.
Пользователь сталкивается с проблемой экспорта списка открытых файлов в текстовый файл через утилиту `OpenFiles.exe` из среды разработки Delphi XE2, где, несмотря на успешное выполнение команды, результат записывается в пустой файл.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.