powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение значения из командной строки
10 сообщений из 10, страница 1 из 1
Получение значения из командной строки
    #34322645
Фотография smoyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть виндовая функция, которая возврощает результат работы в командную строку. Подскажите, как мне получить это значение? Функцию запускаю через ShellExecuteEx.
...
Рейтинг: 0 / 0
Получение значения из командной строки
    #34322663
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне бы очень сильно хотелось узнать что есть "возврощает результат работы в командную строку". Вот хоть убей не могу представить как это такое возможно
...
Рейтинг: 0 / 0
Получение значения из командной строки
    #34322673
Фотография smoyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция certreg.exe. Выглядит это примерно так
...
Рейтинг: 0 / 0
Получение значения из командной строки
    #34322691
Tosh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всеравно не понятно.
Давайте определяться с определениями? Возвращает значения в командную строку (в примере в упор не увидел) или выводит в консоль? Если выводит в консоль - ищите перехват вывода консольного приложения
...
Рейтинг: 0 / 0
Получение значения из командной строки
    #34322726
Фотография smoyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заставили вы таки меня в справку виндовс вылезти за определениями:
Общие сведения о командной оболочке
Командная оболочка — это отдельный программный продукт, который обеспечивает прямую связь между пользователем и операционной системой. Текстовый пользовательский интерфейс командной строки предоставляет среду, в которой выполняются приложения и служебные программы с текстовым интерфейсом. В командной оболочке программы выполняются и результат выполнения отображается на экране в виде, сходном с интерпретатором Command.com MS-DOS . Командная оболочка Windows XP использует интерпретатор команд Cmd.exe, который загружает приложения и направляет поток данных между приложениями, для перевода введенной команды в понятный системе вид.Что такое консоль там определения нет, но вобще я думал, что это и есть командная строка (в том числе).

Вобщем мне усе равно как вы это назавыете, консоль или командная строка или мумба-юмба, вы подскажите пожалуста, как мне оттуда получить результат работы программы? Ну или перехватить вывод консольного приложения? Хотяб названия функций, описание я сам найду.
...
Рейтинг: 0 / 0
Получение значения из командной строки
    #34322759
srf2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тынц
...
Рейтинг: 0 / 0
Получение значения из командной строки
    #34322984
Vlaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извращаться так извращаться :

Process32First
Process32Next
GetStartUpInfo
Если lpTitle = 'заголовок вашего консольного окна',
то посмотреть заполнено ли hStdOutput,
если да то возможно его можно использовать в ReadConsoleOutput
если не заполнен то
нужно как-то получить хэндл стандартного вывода у чужого процесса.
Как это сделать ищите сами, я не нашёл.
...
Рейтинг: 0 / 0
Получение значения из командной строки
    #34323164
Фотография smoyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извращенцы нас окружают...

Одын гений, знающий синтаксис и перечень команд в командной строке посоветовал мне в конце вызова программы добавить '>имя_файла.бла'. Таким образом перенаправляется поток вывода в файл. Т.е. вместо того, чтобы вывести результат работы в консоль, прога выводит его в файл. Ну а уж его то разобрать нет проблем. Проблема теперь в том, что в консоли все фурычит, а из программы если запускать, то не фурычит. Т.е. и ошибок не выдает, и выводить ничо не выводит.

Щас попробую разобратся, если не получится заюзаю пример куда меня srf2000 послал. Там правда тож разбиратся до фига чо как работает, ну ды ладно эт дело привычное:)
...
Рейтинг: 0 / 0
Получение значения из командной строки
    #34323353
Vlaka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если консоль запускается из вашей программы тогда всё проще:

CreateProcess('C:\1.exe', ..... здесь же указывается StartUpInfo куда можно попробовать подсунуть хендлы стандартного вывода и ввода )

Кстати в том примере в они являются хендлами пайпов, затем из этих пайпов как из обычных файлов читаются строки.
...
Рейтинг: 0 / 0
Получение значения из командной строки
    #34325683
Фотография smoyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
srf2000тынцНэ работает. Говорит "Версии OLE на компьютерах клиента и сервера не совпадают.<адрес_памяти>(<большое_отрицательное_число>)". Разбиратся не охота, я в этом коде хорошо если половину понимаю (а то и меньше). Так что я поюзал инет и нашел полностью рабочий пример:
Код: plaintext
\n function  GetDosOutput( const  CommandLine,Parametrs: string ):  string ;\n var \n  SA: TSecurityAttributes;\n  SI: TStartupInfo;\n  PI: TProcessInformation;\n  StdOutPipeRead, StdOutPipeWrite: THandle;\n  WasOK: Boolean;\n  Buffer:  array [ 0 .. 255 ]  of  Char;\n  BytesRead: Cardinal;\n  WorkDir, Line:  String ;\n begin \n  Application.ProcessMessages;\n   with  SA  do \n     begin \n      nLength := SizeOf(SA);\n      bInheritHandle := True;\n      lpSecurityDescriptor :=  nil ;\n     end ;\n   // создаём пайп для перенаправления стандартного вывода \n  CreatePipe(StdOutPipeRead,   // дескриптор чтения \n             StdOutPipeWrite,  // дескриптор записи \n             @SA,               // аттрибуты безопасности \n              0                  // количество байт принятых для пайпа - 0 по умолчанию \n             );\n   try \n     // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода, \n     // а так же проверяем, чтобы он не показывался на экране. \n     with  SI  do \n       begin \n        FillChar(SI, SizeOf(SI),  0 );\n        cb := SizeOf(SI);\n        dwFlags := STARTF_USESHOWWINDOW  or  STARTF_USESTDHANDLES;\n        wShowWindow := SW_HIDE;\n        hStdInput := GetStdHandle(STD_INPUT_HANDLE);  // стандартный ввод не перенаправляем \n        hStdOutput := StdOutPipeWrite;\n        hStdError := StdOutPipeWrite;\n       end ;\n     // Запускаем компилятор из командной строки \n    WorkDir := ExtractFilePath(CommandLine);\n    WasOK := CreateProcess( nil ,\n                           PChar(CommandLine+\' \'+Parametrs),\n                            nil ,\n                            nil ,\n                           True,\n                            0 ,\n                            nil ,\n                           PChar(WorkDir),\n                           SI,\n                           PI);\n     // Теперь, когда дескриптор получен, для безопасности закрываем запись. \n     // Нам не нужно, чтобы произошло случайное чтение или запись. \n    CloseHandle(StdOutPipeWrite);\n     // если процесс может быть создан, то дескриптор, это его вывод \n     if   not  WasOK  then   raise  Exception.Create(\'Could not execute command line!\')\n     else \n       try \n         // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено \n        Line := \'\';\n         repeat \n           // читаем блок символов (могут содержать возвраты каретки и переводы строки) \n          WasOK := ReadFile(StdOutPipeRead, Buffer,  255 , BytesRead,  nil );\n           // есть ли что-нибудь ещё для чтения? \n           if  BytesRead >  0   then \n             begin \n               // завершаем буфер PChar-ом \n              Buffer[BytesRead] := # 0 ;\n               // добавляем буфер в общий вывод \n              Line := Line + Buffer;\n             end ;\n         until   not  WasOK  or  (BytesRead =  0 );\n         // ждём, пока завершится консольное приложение \n        WaitForSingleObject(PI.hProcess, INFINITE);\n       finally \n         // Закрываем все оставшиеся дескрипторы \n        CloseHandle(PI.hThread);\n        CloseHandle(PI.hProcess);\n       end ;\n   finally \n    result:=Line;\n    CloseHandle(StdOutPipeRead);\n   end ;\n end ;
Спасибо всем, кто помогал советами, я и знать не знал, что это называется "перехват вывода консольного приложения" Это мне очень помогло при поиске в инете.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение значения из командной строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]