前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C/C++/Delphi 调用命令并且显示执行结果

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

作者头像
obaby
发布2023-02-24 10:49:05
6270
发布2023-02-24 10:49:05
举报
文章被收录于专栏:obaby@marsobaby@mars

C/C++ 代码:

代码语言:javascript
复制
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 代码:

代码语言:javascript
复制
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://h4ck.org.cn/

* 本文标题: 《C/C++/Delphi 调用命令并且显示执行结果》

* 本文链接:https://cloud.tencent.com/developer/article/2223608

* 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。


分享文章:

相关文章:

  1. Delphi Read/Write REG_MULTI_SZ
  2. Send a HTTP POST Request in Delphi using WinInet api
  3. Delphi Source String Crypt 0.1
  4. Delphi Get HDD Serial Number
  5. Delphi Tips Explorer 2007 v3.0
  6. Interactive Delphi Reconstructor 2.5.3 Beta
  7. Delphi 2010產品技術發表會投影片和範例檔!
  8. Delphi 关键字详解
  9. Delphi 7 优化精简全功能版 v7.3
  10. Delphi 记事本【有码有真相】
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2011年11月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 相关文章:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档