Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Проблема с с выводом...

Ответить
Настройки темы
Delphi - Проблема с с выводом...

Аватара для ultrakiller

Пользователь


Сообщения: 120
Благодарности: 6

Профиль | Отправить PM | Цитировать


Изменения
Автор: ultrakiller
Дата: 03-12-2009
Описание: Уточнение
Есть вот такой код, он рабочий..
Код: Выделить весь код
procedure TForm1.RunDosInMemo(CmdLine:String;AMemo:TMemo);
const
   ReadBuffer = 2400;
var
  Security        : TSecurityAttributes;
  ReadPipe,WritePipe  : THandle;
  start           : TStartUpInfo;
  ProcessInfo     : TProcessInformation;
  Buffer          : PChar;
  BytesRead       : DWord;
  Apprunning      : DWord;
  WasOK           : Boolean;
begin
  Screen.Cursor:=CrHourGlass;

  With Security do
  begin
    nlength              := SizeOf(TSecurityAttributes);
    binherithandle       := true;
    lpsecuritydescriptor := nil;
  end;

  if Createpipe (ReadPipe, WritePipe, @Security, 0) then
    begin
      Buffer  := AllocMem(ReadBuffer + 1);
      FillChar(Start,Sizeof(Start),#0);

      start.cb          := SizeOf(start);
      start.hStdOutput  := WritePipe;
      start.hStdInput   := ReadPipe;
      start.dwFlags     := STARTF_USESTDHANDLES +
                           STARTF_USESHOWWINDOW;
      start.wShowWindow := SW_HIDE;
      if CreateProcess(nil,
          PWChar(WideString(CmdLine)),
          nil,//@Security,
          nil,//@Security,
          true,
          NORMAL_PRIORITY_CLASS,
          nil,
          nil,
          start,
          ProcessInfo)
         // CreateProcess(nil, 'CmdLine', nil, nil, true, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo)
      then
      begin
        CloseHandle(WritePipe);
        Apprunning := WaitForSingleObject (ProcessInfo.hProcess,100);

        try
          repeat
            WasOK:=ReadFile(ReadPipe,Buffer[0], ReadBuffer,BytesRead,nil);
            Buffer[BytesRead]:= #0;
            OemToAnsi(PAnsiChar(Buffer),PAnsiChar(Buffer));
            AMemo.Text := AMemo.text + String(Buffer);

            Application.ProcessMessages;
          until (not WasOK) or ( BytesRead = 0 );
        finally
          CloseHandle(ProcessInfo.hProcess);
          CloseHandle(ProcessInfo.hThread);
        end;
    end;

    FreeMem(Buffer);
    CloseHandle(ReadPipe);
  end;
  Screen.Cursor:=CrDefault;

end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 Memo1.Clear;
 RunDosInMemo('ping 10.1.0.115',Memo1);
end;
Проблема что при выводе в Memo он выдает квадратики...
Что вы посоветуете
Код взял с форума , и доработал с помощью статьи
статьи
Среда Delphi 2009

Отправлено: 09:17, 03-12-2009

 

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


ultrakiller, посоветую сделать перекодировку, функцией MultiByteToWideChar() ответа с консоли, перед отправкой в Memo.
Пример для Делфи не приведу, есть на С
Код: Выделить весь код
BOOL ret = true;
char BufferA[MAX_PATH]="";

DWORD NumberOfBytesRead = 0;

do
{
	ret = ReadFile(hReadPipe, &BufferA, MAX_PATH-1, &NumberOfBytesRead, 0);
	if (NumberOfBytesRead < MAX_PATH-1)
		BufferA[NumberOfBytesRead]='\0';
	else
		BufferA[MAX_PATH-1]='\0';

	wchar_t BufferW[MAX_PATH]=L"";
	MultiByteToWideChar(CP_OEMCP, 0, BufferA, -1, BufferW, MAX_PATH);
	if (hEdit != NULL)
		AddTextW(hEdit, BufferW);
	//...
}while (ret != 0);
Это фрагмент кода с программы MultiBoot
Фрагмент добавлен в программу после перевода с VB6 - Capture the Output of a DOS application, в которой не было перекодировки.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:20, 04-12-2009 | #2



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для ultrakiller

Пользователь


Сообщения: 120
Благодарности: 6

Профиль | Отправить PM | Цитировать


Спасибо за ответ, но подскажите все-таки в чем глюк

Отправлено: 09:22, 04-12-2009 | #3


Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


ultrakiller, последний раз работал с Делфи в 7й Версии.
Выскажу предположение, что Memo в Делфи 2009, склонна к Юникоду, так что вызывая MultiByteToWideChar() с первым параметром CP_OEMCP идёт перекодировка с консольной кодировки непосредственно в Юникод, а не просто смена кодировки, как в случаи с OemToAnsi
Например в VB.NET текст для подобного компоненте желательно должен быть в Юникод кодировке, а для Win32 Api элемента управления EDIT, это не принципиально (видимо для обратной совместимости).

Отправлено: 20:25, 05-12-2009 | #4


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата Admiral:
что Memo в Делфи 2009, склонна к Юникоду »
Я уверен что там Unicode, т.к. C++ Builder 2009 поставляется на одном диске с Delphi 2009, а в первом Memo на юникоде.

Я не знаю только, есть ли в Delphi 2009 функции аналогичные в C++

Цитата Drongo:
Как мне сказали, нужно указывать вторым параметром в SaveToFile указывать соответствующую кодировку:
Код:
TEncoding::Unicode
TEncoding::UTF8
TEncoding::Default
TEncoding::ASCII »
Возможно, не пропобовал, для открытия нужно воспользоваться (C++) аналогичными для Delphi, функциями чтения
Цитата:
static TEncoding* __fastcall GetASCII();
static TEncoding* __fastcall GetBigEndianUnicode();
static TEncoding* __fastcall GetDefault();
static TEncoding* __fastcall GetUnicode();
static TEncoding* __fastcall GetUTF7();
static TEncoding* __fastcall GetUTF8();

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 21:53, 05-12-2009 | #5


Аватара для opel431

Ветеран


Contributor


Сообщения: 1803
Благодарности: 714

Профиль | Отправить PM | Цитировать


Цитата ultrakiller:
Проблема что при выводе в Memo он выдает квадратики...
Что вы посоветуете »
Цитата ultrakiller:
Среда Delphi 2009 »
var
Buffer:PAnsiChar;
......
......

begin
.....
OemToChar(Buffer,PWideChar(Buffer)); //XP
; OemToAnsi(Buffer, Buffer) //Seven
AMemo.Text:=AMemo.Text+String(Buffer);
.....
end;

-------
Хвала тому, кто встав среди камней, уча другого, сам будет умней.


Последний раз редактировалось opel431, 04-11-2011 в 16:12.


Отправлено: 08:57, 05-09-2011 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Проблема с с выводом...

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Драйвер - [решено] проблема с выводом звука CJV Microsoft Windows 2000/XP 9 20-06-2012 19:57
Драйвер - Проблема с выводом по SPDIF на Realtek HD Xavier Teodonius Microsoft Windows 2000/XP 0 08-03-2009 12:31
Проблема с выводом сигнала 30Hz на ЖК-ТВ Xavier Teodonius Непонятные проблемы с Железом 6 24-01-2009 12:12
C/C++ - Си и функция рандома с последующим выводом. ElHalcone Программирование и базы данных 2 12-12-2008 21:13
Проблема с выводом звука в .avi samurai Видео и аудио: обработка и кодирование 10 04-05-2007 17:41




 
Переход