|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
delphi 2010 кодировки....
Такая проблема
есть код, выполняющий cmd команду и выводящий ответ в мемо Код:
function GetDosOutput(const CommandLine: string): string; var SA: TSecurityAttributes; SI: TStartupInfo; PI: TProcessInformation; StdOutPipeRead, StdOutPipeWrite: THandle; WasOK: Boolean; Buffer: array[0..255] of Char; BytesRead: Cardinal; cmdLine, 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); cmdLine := PChar('C:\\WINDOWS\\system32\\cmd.exe /C ' + CommandLine); //ShowMessage(cmdLine); WasOK := CreateProcess(nil, PChar(cmdLine), nil, nil, True, 0, nil, PChar('C:\\'), SI, PI); // Теперь, когда дескриптор получен, для безопасности закрываем запись. // Нам не нужно, чтобы произошло случайное чтение или запись. CloseHandle(StdOutPipeWrite); // если процесс может быть создан, то дескриптор, это его вывод if not WasOK then raise Exception.Create('Could not execute command line!') 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; until not WasOK or (BytesRead = 0); // ждем, пока завершится консольное приложение WaitForSingleObject(PI.hProcess, INFINITE); finally // Закрываем все оставшиеся дескрипторы CloseHandle(PI.hThread); CloseHandle(PI.hProcess); end; finally result := Line; CloseHandle(StdOutPipeRead); end; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text := GetDosOutput(Edit1.Text); end; нада типы подправить…я пробовал, не получилось delphi 2010 помогите, в чём проблема ? кстати у cmd.exe есть возможность выводить результат в ansi и unicode, если поможет /A ansi /U unicode пожалуйста!!!помогите кстати, можно дать любой другой способ выполнения cmd команд и получения результата для delphi 2010, буду очень рад) Последний раз редактировалось Admin, 21.08.2010 в 23:13. |
#2
|
|||
|
|||
(( а я писал программы почти 1год на delphi 2007 потом установил delphi 2010 а на 2010 эти коды не работают проблемы иногда бывают с кодировками .....какие-та там значение string неверные (((
поэтому пишу дальше на старый delphi 2007 ))))))))))) |
#3
|
||||
|
||||
При работе с консолькой полезно воспользоваться такими функциями:
//Входная кодовая таблица консоли установлена в Win-1251. SetConsoleCP('1251'); //Выходная кодовая таблица консоли установлена в Win-1251. SetConsoleOutputCP('1251'); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |