教训:接收缓冲区一定要记得清空

有一个需求是需要程序获得本机的ip配置,因此采用的方式是通过C++代码调用ipconfig的方式获得。
在网上查阅了相关的资料之后,最终选择采用调用CreateProcess的方式获取。
部分代码如下:

string getIpconfigCommandResult()
{
	string command("ipconfig");
	unsigned len = command.size() * 2;
	setlocale(LC_CTYPE, "");
	wchar_t *p = new wchar_t[len];
	mbstowcs(p, command.c_str(), len);
	wstring newCommand(p);
	delete[] p;

	SECURITY_ATTRIBUTES sa = { sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
	HANDLE hRead, hWrite;
	if (!CreatePipe(&hRead, &hWrite, &sa, 0))
	{
		return string();
	}

	STARTUPINFO si = { sizeof(STARTUPINFO) };
	GetStartupInfo(&si);
	si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
	si.wShowWindow = SW_HIDE; 
	si.hStdError = hWrite;
	si.hStdError = hWrite;
	si.hStdOutput = hWrite; 
							
	PROCESS_INFORMATION pi;
	if (!CreateProcess(NULL,
		(LPWSTR)newCommand.c_str(),
		NULL,
		NULL,
		TRUE,
		NULL,
		NULL,
		NULL,
		&si,
		&pi))
	{
		return ("Cannot create process");
	}
	CloseHandle(hWrite);
					
	string strRetTmp;
	char buff[1024] = { 0 };
	DWORD dwRead = 0;
	strRetTmp = buff;
	while (ReadFile(hRead, buff, 1024, &dwRead, NULL))
	{
		strRetTmp += buff;
	}
	CloseHandle(hRead);

	return strRetTmp;
}

在调用此函数的过程中,发现显示上会有一些问题,也就是返回的strRetTmp有异常,会出现乱码显示的问题。如下图所示:
在这里插入图片描述
后来经过追踪代码,发现原因在于执行ReadFile这个函数的时候,没有清空接收缓冲区。

//原始内容
while (ReadFile(hRead, buff, 1024, &dwRead, NULL))
{
	strRetTmp += buff;
}

//修改之后
while (ReadFile(hRead, buff, 1024, &dwRead, NULL))
{
	strRetTmp += buff;
	memset(buff, 0, 1024);
}

这样其显示就正常了。
在这里插入图片描述

参考文档
C++调用cmd

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值