有一个需求是需要程序获得本机的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