我有这段代码:
system("echo %username%");
我想将其结果重定向到一个变量,比如uname
。
我该怎么做?
我知道WinAPI,但我想这样做。
答案 0 :(得分:2)
快速,丑陋和肮脏的方法是将输出重定向到文件,然后读取该文件。
system("echo %username% > someFile.txt");
更详细的方法是使用CreateProcess
API和以下命令行:cmd.exe /c echo %username%
该API允许您指定自定义标准输入和标准输出。您可以为标准输出创建管道,如下所示:
HANDLE g_hChildStd_OUT_Wr = NULL;
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
// Create a pipe for the child process's STDOUT.
//
if ( !CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0) ) return -1;
然后在CreateProcess API中使用此管道。像这样:
TCHAR szCmdline[]=TEXT("cmd.exe /c echo %username%");
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
// Set up members of the PROCESS_INFORMATION structure.
//
memset( &piProcInfo, 0, sizeof(PROCESS_INFORMATION) );
// Set up members of the STARTUPINFO structure.
// This structure specifies the STDIN and STDOUT handles for redirection.
//
memset( &siStartInfo, 0, sizeof(STARTUPINFO) );
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
// Create the child process.
//
bSuccess = CreateProcess(NULL,
szCmdline, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo); // receives PROCESS_INFORMATION
然后用这样的东西读取管道:
DWORD dwRead, dwWritten;
CHAR chBuf[BUFSIZE];
BOOL bSuccess = FALSE;
HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
for (;;)
{
bSuccess = ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
if( ! bSuccess || dwRead == 0 ) break;
}
该进程将异步运行,因此您需要知道进程何时终止并进行适当的清理。因此,为了使这项工作能够在这里学习一些细节。
可在此处找到完整的示例: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682499(v=vs.85).aspx
答案 1 :(得分:0)
如果目标只是获取用户名,您是否考虑过getenv
; getenv( "username" )
将直接返回。
否则,如果你想要做更多的事情,并希望将结果放在一个文件中...你传递给system
的字符串会传递给命令解释器,所以你可以在命令中做任何事情cmd.exe
中的行将在system
中工作:文件重定向,管道到另一个进程等。