C/C++/Delphi 调用命令并且显示执行结果

C/C++ 代码:

void ExecutCmd()
{
	SECURITY_ATTRIBUTES sa;
	HANDLE hRead,hWrite;
	wchar_t * lpCommandLine =_T("ping.exe www.h4ck.org.cn ");
	sa.nLength = sizeof(SECURITY_ATTRIBUTES);
	sa.lpSecurityDescriptor = NULL;
	sa.bInheritHandle = TRUE;

	TCHAR temp[255] = {0};
	_tcscpy(temp,lpCommandLine);
	if (!CreatePipe(&hRead,&hWrite,&sa,0)) {
		MessageBox(_T("Error On CreatePipe()"));
		return;
	}

	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	si.cb = sizeof(STARTUPINFO);
	GetStartupInfo(&si);
	si.hStdError = hWrite;
	si.hStdOutput = hWrite;
	si.wShowWindow = SW_HIDE;
	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
	if (!CreateProcess(NULL,temp
		,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) {
			MessageBox(_T("Error on CreateProcess()"));
			return;
	}
	CloseHandle(hWrite);

	char buffer[4096] = {0};
	DWORD bytesRead;
	while (true) {

		if (ReadFile(hRead,buffer,0x3FFu,&bytesRead,NULL) == NULL)
			break;
		outputstr += buffer;//m_outputstr is CString
		OutputDebugString(outputstr);
		UpdateData(false);
		Sleep(200);
		
	}
}


Delphi 代码:

procedure CheckResult(b: Boolean); 
begin 
if not b then 
raise Exception.Create(SysErrorMessage(GetLastError)); 
end; 

function RunDOS(const CommandLine: string): string; 
var 
HRead, HWrite: THandle; 
StartInfo: TStartupInfo; 
ProceInfo: TProcessInformation; 
b: Boolean; 
sa: TSecurityAttributes; 
inS: THandleStream; 
sRet: TStrings; 
begin 
Result := ''; 
FillChar(sa, sizeof(sa), 0); 
//设置允许继承,否则在NT和2000下无法取得输出结果 
sa.nLength := sizeof(sa); 
sa.bInheritHandle := True; 
sa.lpSecurityDescriptor := nil; 
b := CreatePipe(HRead, HWrite, @sa, 0); 
CheckResult(b); 

FillChar(StartInfo, SizeOf(StartInfo), 0); 
StartInfo.cb := SizeOf(StartInfo); 
StartInfo.wShowWindow := SW_HIDE; 
//使用指定的句柄作为标准输入输出的文件句柄,使用指定的显示方式 
StartInfo.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; 
StartInfo.hStdError := HWrite; 
StartInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE); //HRead; 
StartInfo.hStdOutput := HWrite; 

b := CreateProcess(nil, //lpApplicationName: PChar 
PChar(CommandLine), //lpCommandLine: PChar 
nil, //lpProcessAttributes: PSecurityAttributes 
nil, //lpThreadAttributes: PSecurityAttributes 
True, //bInheritHandles: BOOL 
CREATE_NEW_CONSOLE, 
nil, 
nil, 
StartInfo, 
ProceInfo); 

CheckResult(b); 
WaitForSingleObject(ProceInfo.hProcess, INFINITE); 

inS := THandleStream.Create(HRead); 
if inS.Size > 0 then 
begin 
sRet := TStringList.Create; 
sRet.LoadFromStream(inS); 
Result := sRet.Text; 
sRet.Free; 
end; 
inS.Free; 

CloseHandle(HRead); 
CloseHandle(HWrite); 
end;
☆版权☆

* 网站名称:obaby@mars
* 网址:https://nai.dog/
* 个性:https://oba.by/
* 本文标题: 《C/C++/Delphi 调用命令并且显示执行结果》
* 本文链接:https://nai.dog/2011/11/3432
* 短链接:https://oba.by/?p=3432
* 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。


You may also like

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注