0

重複の可能性:
単純なシェル コマンドを実行する

system()同様に単純な方法で同じことを行う Win32 API 関数はありますか? 私が作成している特定のコンソール プログラムでは、できる限り Windows ライブラリに限定したいと考えています。

4

3 に答える 3

2

CreateProcess が良くない理由はありますか?

于 2012-10-17T17:06:18.490 に答える
2

あなたはただ使うことができますsystem()

システム関数はコマンド インタープリターを検出します。これは通常、Windows NT オペレーティング システムでは CMD.EXE、Windows では COMMAND.COM です。次に、システム関数は引数文字列をコマンド インタープリターに渡します。

于 2012-10-17T17:06:32.500 に答える
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;
}
于 2012-10-17T19:59:57.987 に答える