|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Проблема с с выводом... |
|
Delphi - Проблема с с выводом...
|
Пользователь Сообщения: 120 |
Профиль | Отправить PM | Цитировать
Есть вот такой код, он рабочий..
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; Что вы посоветуете Код взял с форума , и доработал с помощью статьи статьи Среда Delphi 2009 |
|
Отправлено: 09:17, 03-12-2009 |
Ветеран Сообщения: 3320
|
Профиль | Отправить 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); Фрагмент добавлен в программу после перевода с VB6 - Capture the Output of a DOS application, в которой не было перекодировки. |
Отправлено: 01:20, 04-12-2009 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 120
|
Профиль | Отправить PM | Цитировать Спасибо за ответ, но подскажите все-таки в чем глюк
|
Отправлено: 09:22, 04-12-2009 | #3 |
Ветеран Сообщения: 3320
|
Профиль | Отправить PM | Цитировать ultrakiller, последний раз работал с Делфи в 7й Версии.
Выскажу предположение, что Memo в Делфи 2009, склонна к Юникоду, так что вызывая MultiByteToWideChar() с первым параметром CP_OEMCP идёт перекодировка с консольной кодировки непосредственно в Юникод, а не просто смена кодировки, как в случаи с OemToAnsi Например в VB.NET текст для подобного компоненте желательно должен быть в Юникод кодировке, а для Win32 Api элемента управления EDIT, это не принципиально (видимо для обратной совместимости). |
Отправлено: 20:25, 05-12-2009 | #4 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Admiral:
Я не знаю только, есть ли в Delphi 2009 функции аналогичные в C++ Цитата Drongo:
Цитата:
|
||||
------- Отправлено: 21:53, 05-12-2009 | #5 |
Ветеран Сообщения: 1803
|
Профиль | Отправить PM | Цитировать Цитата ultrakiller:
Цитата ultrakiller:
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 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Драйвер - [решено] проблема с выводом звука | 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 |
|