Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Работа с окном cmd


Автор: ИгнатьевАлексей 12.3.2006, 19:09
Господа! Не могу найти верный путь! Помогите, пожалуйста!


Надо вводить команду в окно cmd, а потом прочесть то, что оно возвращает! С первой проблемой я худо-бедно справился через иммитацию нажатия клавишь, а вот с чтением дело плохо! smile

Специалисты VB отправили меня на изучение API-функций. Но я так и не нашел таких процедур.

Подскажите, какие API-функции использовать, или куда бежать! smile


Заранее благодарен!

Автор: _hunter 13.3.2006, 12:11
http://forum.vingrad.ru/index.php?showtopic=25023
http://forum.vingrad.ru/index.php?showtopic=85501

Автор: ИгнатьевАлексей 13.3.2006, 21:04
Спасибо!

Только я так и не понял кикие функции Win32API надо использовать?
GetDOSEnvironment-это самое похожее, что я нашел. Ведь я этого кода не понимаю smile

Автор: Yanis 14.3.2006, 11:04
Цитата(ИгнатьевАлексей @ 12.3.2006, 19:09 Найти цитируемый пост)
Специалисты VB

smile

Цитата(ИгнатьевАлексей @ 12.3.2006, 19:09 Найти цитируемый пост)
Надо вводить команду в окно cmd, а потом прочесть то, что оно возвращает! С первой проблемой я худо-бедно справился через иммитацию нажатия клавишь, а вот с чтением дело плохо!

А что за программа? Может твою проблему можно решить путём вывода её результата в файл!? Как это сделать можешь посмотреть здесь http://forum.vingrad.ru/index.php?showtopic=74807.

Автор: ИгнатьевАлексей 14.3.2006, 20:47
Спасибо за предложение!

Правда планируется непрерывный ввод и чтение команд и результатов, но извернуться можно!
Ну а вообще, это программка служебная, черт ее знает как она работает, но только через нее мне доступны необходимые данные!
Она выглядит как обыкновенное DOS-овское окно и имеет свои команды. С другого компа сетевого до нее можно достучаться через TELNET.
Этот способ переадресации в файл
cmd /C ping 127.0.0.1 > E:\ping127_0_0_1.inf
Он чисто DOS-овский, наверное, навряд-ли он там подойдет, или он в данном случае универсальный??? Я просто не разбираюсь особо smile
Завтра попробую на работе!

Автор: Демо 14.3.2006, 23:37
Код

function GetDosOutput( const CommandLine, WorkDir: String;
                      var ResultCode: Cardinal ): String;
var StdOutPipeRead, StdOutPipeWrite: THandle;
   SA                             : TSecurityAttributes;
   SI                             : TStartupInfo;
   PI                             : TProcessInformation;
   WasOK                          : Boolean;
   Buffer                         : array[0..255] of Char;
   BytesRead                      : Cardinal;
   Line                           : String;
Begin
   Application.ProcessMessages;
   With SA do
   Begin
      nLength := SizeOf( SA );
      bInheritHandle := True;
      lpSecurityDescriptor := nil;
   end;
   // создаём пайп для перенаправления стандартного вывода
   CreatePipe( StdOutPipeRead,  // дескриптор чтения
               StdOutPipeWrite, // дескриптор записи
               @SA,              // аттрибуты безопасности
               0                // количество байт принятых для пайпа - 0 по умолчанию
              );
   try
    // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода,
    // а так же проверяем, чтобы он не показывался на экране.
    with SI do
    Begin
       FillChar( SI, SizeOf( SI ), 0 );
       cb := SizeOf( SI );
       dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
       wShowWindow := SW_HIDE; //не показывать окно
       hStdInput := GetStdHandle( STD_INPUT_HANDLE ); // стандартный ввод не перенаправляем
       hStdOutput := StdOutPipeWrite;
       hStdError := StdOutPipeWrite;
    end;

    // Запускаем компилятор из командной строки
    //WorkDir := ExtractFilePath(CommandLine);
    WasOK := CreateProcess( nil,
                            PChar( CommandLine ),
                            nil,
                            nil,
                            True,
                            0,
                            nil,
                            PChar( WorkDir ),
                            SI,
                            PI );
    // Теперь, когда дескриптор получен, для безопасности закрываем запись.
    // Нам не нужно, чтобы произошло случайное чтение или запись.
    CloseHandle( StdOutPipeWrite );
    // если процесс может быть создан, то дескриптор, это его вывод
    if not WasOK then
     raise Exception.Create( 'Ошибка выполнения или компиляции: ' +
            Chr( 10 ) + Chr( 13 ) + CommandLine )
    else
      try
        // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено
        Line := '';
        Repeat
           // читаем блок символов (могут содержать возвраты каретки и переводы строки)
           WasOK := ReadFile( StdOutPipeRead, Buffer, 255, BytesRead, nil );
           // есть ли что-нибудь ещё для чтения?
           if BytesRead > 0 then
           Begin
              // завершаем буфер PChar-ом
              Buffer[BytesRead] := #0;
              // добавляем буфер в общий вывод
              Line := Line + Buffer;
           end;
           Application.ProcessMessages;
        Until not WasOK or ( BytesRead = 0 );
        // ждём, пока завершится консольное приложение
        WaitForSingleObject( PI.hProcess, INFINITE );
        ResultCode := 0;
        GetExitCodeProcess( PI.hProcess, ResultCode );
      finally
        // Закрываем все оставшиеся дескрипторы
        CloseHandle( PI.hThread );
        CloseHandle( PI.hProcess );
      end;
   finally
     Result := Line;
     CloseHandle( StdOutPipeRead );
 end;
end;


© xShadow

Автор: ИгнатьевАлексей 15.3.2006, 08:26
Господа!
Извините за тупость! smile

В вышеуказанном семпле GetDosOutput - это API-функция, или нет? Что-то мне не найти ее! HELP!!!

Автор: _hunter 15.3.2006, 11:52
эээ... а то, что за вышеуказанной функцией идет ее реализация, тебе ни о чем не говорит?

Автор: Girder 15.3.2006, 17:23
http://forum.vingrad.ru/index.php?showtopic=36445&view=findpost&p=272124


Автор: ИгнатьевАлексей 15.3.2006, 21:38
Огромное спасибо!

Но дела в том, что я пытаюсь работать в VB с помощью API.
Неужели я могу использовать эту функцию из VB подобно API-функции?
Если да, то как? smile

Простите за полнейшую неосведомленность!!!

Автор: bems 15.3.2006, 21:57
Нужно перевести на ВБ smile

Автор: Yanis 16.3.2006, 11:02
Цитата(ИгнатьевАлексей @ 15.3.2006, 21:38 Найти цитируемый пост)
Но дела в том, что я пытаюсь работать в VB с помощью API.
Вообще то у VB небольшие проблемы с WinAPI.

Цитата(ИгнатьевАлексей @ 15.3.2006, 21:38 Найти цитируемый пост)
Неужели я могу использовать эту функцию из VB подобно API-функции?
Наверное сильно извратившись и можно заставить её работать в VB, но путём наращивания большого гемороя smile

Цитата(_hunter @ 15.3.2006, 11:52 Найти цитируемый пост)
эээ... а то, что за вышеуказанной функцией идет ее реализация, тебе ни о чем не говорит?

smile

Автор: Демо 16.3.2006, 11:22
Цитата(bems @ 15.3.2006, 21:57 Найти цитируемый пост)
Нужно перевести на ВБ


А может просто использовать DLL в VB?
А в DLL завернуть интерфес работы с консолью.

Автор: bems 16.3.2006, 14:26
Я бы так не стал делать - не хочется лиший модуль только для этого. Но если парень пишет на ВБ - че там уже стесняться? smile

Автор: ИгнатьевАлексей 17.3.2006, 15:54
Друзья!
Я в замешательстве!
smile
Мз мира VB по этому вопросу послали к API. "Изучай их, мол, парень! Применишь в VB и будешь счастлив!"
Пришел я на форум API, а функций то таких толком и нет, чтобы в моем случае применить?!
Или я по-неопытности все неправильно понимаю?
Или я с форумом ошибся?
Что же мне делать? Переходить на др. язык из-за одной задачи? smile

Автор: _hunter 17.3.2006, 16:12
конечно ошибся. ты пришел на форум "Delphi: WinAPI"
а если ты хочеш с WinAPI работать из басика -- тебе нужно куда-нить типа "басик: WinAPI" идти...

Автор: bems 17.3.2006, 16:38
Цитата(ИгнатьевАлексей @ 17.3.2006, 15:54 Найти цитируемый пост)
а функций то таких толком и нет

Вот список апи из кода Демо. Сделай на них свою реализацию на ВБ. Только сначала нужно разобраться в каждой отдельно

CreatePipe
GetStdHandle
StdOutPipeWrite;
StdOutPipeWrite;
CreateProcess
CloseHandle
WaitForSingleObject
GetExitCodeProcess




Автор: Romikgy 17.3.2006, 16:40
Или МСДН

Автор: ИгнатьевАлексей 17.3.2006, 19:34
Цитата

Сделай на них свою реализацию на ВБ

Тут я не совсем понимаю! Что это значит? Я могу их объявить в VB и использовать, или разобраться как работают и переписать в коде VB? smile

Цитата

а если ты хочеш с WinAPI работать из басика -- тебе нужно куда-нить типа "басик: WinAPI" идти...


Не нашел я что-то форума такого! Может ты, друг, подскажешь?


А вообще пойду завтра на книжный рынок и куплю толстую книжку Win32API и VB!!!!!!!! Может полегчает!?

Автор: bems 17.3.2006, 19:55
Цитата(ИгнатьевАлексей @ 17.3.2006, 19:34 Найти цитируемый пост)
Я могу их объявить в VB и использовать, или разобраться как работают и переписать в коде VB?
Разобраться как работают, объявить и использовать. Когда будешь разбираться тебе может сильно помочь человек знающий дельфи, с его помощью поймешь, как они используются в данном примере. И читай МыСыДыНы

Цитата(ИгнатьевАлексей @ 17.3.2006, 19:34 Найти цитируемый пост)
Не нашел я что-то форума такого! Может ты, друг, подскажешь?
на этом сайте нету.

Цитата(ИгнатьевАлексей @ 17.3.2006, 19:34 Найти цитируемый пост)
пойду завтра на книжный рынок и куплю толстую книжку Win32API и VB!!!!!!!! Может полегчает!?
Пойди полюбому. Но полегчает не сразу

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)