什么是Win32 API等效的stdlib system()函数?

时间:2012-10-17 17:02:44

标签: c++ c winapi

  

可能重复:
  Run a simple shell command

是否有一个Win32 API函数以同样简单的方式执行与system()相同的操作?在我创建的特定控制台程序中,我希望尽可能地限制Windows库。

3 个答案:

答案 0 :(得分:2)

是否有某些原因CreateProcess不好?

答案 1 :(得分:2)

您可以使用system()

  

系统函数找到命令解释程序,它通常是Windows NT操作系统中的CMD.EXE或Windows中的COMMAND.COM。系统函数然后将参数字符串传递给命令解释器。

答案 2 :(得分:1)

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;
}