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

C/C++ 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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;

You may also like

发表评论

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