可能重复:
运行一个简单的 shell 命令
是否有一个 Win32 API 函数system()
以同样简单的方式做同样的事情?在我正在创建的特定控制台程序中,我想尽可能地限制 Windows 库。
可能重复:
运行一个简单的 shell 命令
是否有一个 Win32 API 函数system()
以同样简单的方式做同样的事情?在我正在创建的特定控制台程序中,我想尽可能地限制 Windows 库。
是否有某些原因 CreateProcess 不好?
你可以只使用system()
.
系统函数查找命令解释器,它通常是 Windows NT 操作系统中的 CMD.EXE 或 Windows 中的 COMMAND.COM。然后系统函数将参数字符串传递给命令解释器。
system()
只是在内部调用CreateProcess()
,所以你可以直接做同样的事情,例如:
int my_system(LPCTSTR command)
{
TCHAR szComSpec[MAX_PATH+1];
DWORD dwLen = GetEnvironmentVariable(_T("COMSPEC"), szComSpec, MAX_PATH);
if ((dwLen == 0) || (dwLen > MAX_PATH))
return -1;
LPTSTR szCmdLine = (LPTSTR) LocalAlloc(LPTR, (dwLen+lstrlen(command)+9) * sizeof(TCHAR));
if (!szCmdLine)
return -1;
wsprintf(szCmdLine, _T("\"%s\" /C \"%s\""), szComSpec, command);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
BOOL bRet = CreateProcess(NULL, szCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (bRet)
{
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
LocalFree(szCmdLine);
return (bRet) ? 0 : -1;
}