C++ 新手。
我下午大部分时间都在看,有没有人知道执行 DOS 命令并保存到 Windows 窗体应用程序的变量的简单方法?
您可以使用system("dir");
. 这将打开命令提示符并运行 dir 命令。
或者,您可以使用 WinExec。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms687393(v=vs.85).aspx
您可以将命令重定向到文本文件,然后读取它。
bool execDosCommand(char *command, AnsiString &output)
{
SECURITY_ATTRIBUTES sa;
ZeroMemory(&sa,sizeof(SECURITY_ATTRIBUTES));
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle=true;
sa.lpSecurityDescriptor=NULL;
HANDLE ReadPipeHandle;
HANDLE WritePipeHandle; // not used here
if(!CreatePipe(&ReadPipeHandle, &WritePipeHandle, &sa, 0))
return false;
STARTUPINFOA si;
ZeroMemory(&si,sizeof(STARTUPINFO));
si.cb=sizeof(STARTUPINFO);
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow=SW_HIDE;
si.hStdOutput=WritePipeHandle;
si.hStdError=WritePipeHandle;
PROCESS_INFORMATION pi;
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
text cmd;
cmd.print("/c %s", command);
char pathbuf[MAX_PATH];
_searchenv("CMD.EXE", "PATH", pathbuf);
if(!CreateProcessA(pathbuf, cmd.t_str(), NULL, NULL, true, 0, NULL, NULL, &si, &pi))
return false;
char Data[1024];
for (;;)
{
DWORD BytesRead;
DWORD TotalBytes;
DWORD BytesLeft;
if(!PeekNamedPipe(ReadPipeHandle,Data,sizeof(Data),&BytesRead, &TotalBytes,&BytesLeft)) return false;
if(BytesRead)
{
if(!ReadFile(ReadPipeHandle,Data,sizeof(Data)-1,&BytesRead,NULL))
return false;
Data[BytesRead]='\0';
output += Data;
}
else
{
if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)
break;
}
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(ReadPipeHandle);
CloseHandle(WritePipeHandle);
return true;
}
例如: execDosCommand("dir C:\", output);
正如 roymustang 提到的,您可以使用系统命令从系统执行另一个命令。例如,这可以是一个批处理脚本,它将命令的输出通过管道传输到一个文本文件中。然后,您可以阅读文本文件以实际获取信息。“返回”命令输出的问题是,命令输出看起来如何?你会将它存储在什么数据结构中?大多数情况下,您会得到一堆未格式化的文本,这些文本无法轻松解析,因此没有真正通用的方法可以将应用程序或脚本的输出返回到 C++ 数据结构中。
您不妨看看这里: http ://docwiki.embarcadero.com/RADStudio/en/System,_wsystem
如上所述,我不相信有一种方法可以将应用程序调用的输出返回到您的程序,至少我从未听说过。
问候,
弗洛里安