读取控制台输出

51 篇文章 0 订阅
46 篇文章 0 订阅


#include <stdio.h>
#include <Shlwapi.h>

//

template <typename CallbackT>
BOOL ShellCommand(LPSTR lpszCmdLine, CallbackT funCallback, DWORD dwContext)
{
	STARTUPINFOA		startupInfo;
	PROCESS_INFORMATION	processInfo;

	SECURITY_ATTRIBUTES securityAttributes = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE, };
	HANDLE hPipeRead	= NULL;
	HANDLE hPipeWrite	= NULL;

	CHAR szBuffer[1024*8] = { 0 };
	DWORD dwBytesRead	= 0;

	BOOL bFlag = FALSE;

	//

	ZeroMemory(&startupInfo, sizeof(startupInfo));
	ZeroMemory(&processInfo, sizeof(processInfo));

	if (!::CreatePipe(&hPipeRead, &hPipeWrite, &securityAttributes, 0)) {
		goto Exit;
	}

	startupInfo.cb			= sizeof(STARTUPINFO);
	::GetStartupInfoA(&startupInfo);

	startupInfo.hStdError	= hPipeWrite;
	startupInfo.hStdOutput	= hPipeWrite;
	startupInfo.wShowWindow	= SW_HIDE;
	startupInfo.dwFlags		= STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;

	if (!::CreateProcessA(NULL, lpszCmdLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo)) {
		goto Exit;
	}
	::CloseHandle(hPipeWrite);
	hPipeWrite = NULL;

	do {
		if (!::ReadFile(hPipeRead, szBuffer, sizeof(szBuffer)-1, &dwBytesRead, NULL)) {
			break;
		}

		funCallback(szBuffer, dwContext);
	} while (::WaitForSingleObject(processInfo.hProcess, 0) == WAIT_TIMEOUT);

	bFlag = TRUE;
Exit:
	if (hPipeRead == NULL) {
		::CloseHandle(hPipeRead);
		hPipeRead = NULL;
	}
	if (hPipeWrite == NULL) {
		::CloseHandle(hPipeWrite);
		hPipeWrite = NULL;
	}
	return bFlag;
}

//

void Print(LPCSTR lpszText, DWORD dwContext)
{
	printf("%s\n", lpszText);
}

//

int main()
{
	ShellCommand("cmd /C dir d:", Print, 0);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值