Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.08.2009, 17:35   #1
dyonysos
Пользователь
 
Регистрация: 24.08.2009
Сообщений: 45
Вопрос Ошибка отображения в TMemo (delphi)



вот код чтения вывода коммандной строки:
Код:
function GetDosOutput(CommandLine: string; Work: string = 'C:\' ): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of Char;
  BytesRead: Cardinal;
  WorkDir: string;
  Handle: Boolean;
begin
  Result := '';
  with SA do begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
  try
    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); // don't redirect stdin
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
    WorkDir := Work;
    Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                            nil, nil, True, 0, nil,
                            PChar(WorkDir), SI, PI);
    CloseHandle(StdOutPipeWrite);
    if Handle then
      try
        repeat
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
          if BytesRead > 0 then
          begin
            Buffer[BytesRead] := #0;
            Result := Result + Buffer;
          end;
        until not WasOK or (BytesRead = 0);
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
    CloseHandle(StdOutPipeRead);
  end;
end;
код для кнопки:

Код:
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add(GetDosOutput(Edit1.Text));
end;
кто знает в чем проблема и как заставить это работать в дэлфи 2009(дэлфи 7 не подходит!)?

ps: как можно записать все "registry root keys" в переменную типа tstrings?

Последний раз редактировалось dyonysos; 26.08.2009 в 18:29.
dyonysos вне форума Ответить с цитированием
Старый 26.08.2009, 20:00   #2
Eofol
Пользователь
 
Аватар для Eofol
 
Регистрация: 20.12.2007
Сообщений: 15
По умолчанию

Скорее всего поможет :

Код:
var
...
  Buffer: array[0..255] of AnsiChar;
...
Eofol вне форума Ответить с цитированием
Старый 26.08.2009, 20:44   #3
dyonysos
Пользователь
 
Регистрация: 24.08.2009
Сообщений: 45
По умолчанию

[QUOTE=Eofol;333266]Скорее всего поможет :

спасибо!!!а почему так? почему в 7 версий работает а тут нет?
dyonysos вне форума Ответить с цитированием
Старый 26.08.2009, 22:23   #4
Eofol
Пользователь
 
Аватар для Eofol
 
Регистрация: 20.12.2007
Сообщений: 15
По умолчанию

В Delphi 7 тип Char соответствовал типу AnsiChar(1 байт), а в D2009 - он соответствует типу WideChar (2 байта).

В данном случае ReadFile пишет в буфер символы Ansi (по 1 байту), а при чтении из буфера: Result := Result + Buffer берется 2 смежных AnsiChar, а и интерпретируются как один WideChar (по 2 байта размером). Например: если первый байт массива равен 98 (код символа 'b'), второй - 99 (код символа 'c') они вместе составят первый элемент массива (т. е. символ с кодом 9899). Вот при отображении таких символов и получается то что получается.

З.Ы. Извиняйте за внятность объяснения, лучше не умею
Eofol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка отображения данных в результате sql запроса в BDE Serjio77 БД в Delphi 9 31.05.2009 20:30
Сортировка текста в компоненте TMemo (Delphi 7) Schutze Помощь студентам 5 28.05.2009 23:38
Люди! Одномерные отображения. Виктория Боско Помощь студентам 3 07.12.2008 15:09
проблемы отображения Karl_Karlovi4 Общие вопросы Delphi 12 31.12.2007 09:21