我用delphi来获取dos输出.
什么原因导致 http://delphi.about.com/cs/adptips2001/a/bltip0201_2.htm的代码无法在vista上使用delphi2009?但它适用于XP中的D7.我不知道要修改哪个部分才能使其正常工作.
什么原因导致 http://delphi.about.com/cs/adptips2001/a/bltip0201_2.htm的代码无法在vista上使用delphi2009?但它适用于XP中的D7.我不知道要修改哪个部分才能使其正常工作.
DelphiDabbler has a solution,虽然我没有亲自测试过:
- 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 AnsiChar;
- 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,True,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;