![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
![]()  | 
	
	
| 
		 | 
	Опции темы | Поиск в этой теме | Опции просмотра | 
| 
	 | 
| 
		 
			 
			#1  
			
			
			
			
		 
		
		
	 | 
|||
		
		
  | 
|||
| 
	
	
		
			
			 Такая проблема 
		
	
		
		
		
		
		
		
			есть код, выполняющий 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');  |