尝试使用 createprocess (API) 在 cmd throw c++ 上运行命令?

Posted

技术标签:

【中文标题】尝试使用 createprocess (API) 在 cmd throw c++ 上运行命令?【英文标题】:trying to run commend on cmd throw c++ using createprocces (API)? 【发布时间】:2016-04-01 12:28:50 【问题描述】:
bool execute()

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    bool flag = true;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    string f = "dir desktop"
    if (CmdLine.parameter != "")
    
        LPSTR l1 = const_cast<char *>(f.c_str());
        CreateProcess(NULL, l1, NULL, NULL, false, 0, NULL, NULL, &si, &pi);
        flag = true;
        //  WaitForSingleObject(pi.hProcess, INFINITE);

        //  // Close process and thread handles. 
        //  CloseHandle(pi.hProcess);
        //  CloseHandle(pi.hThread);
        //
    
    return flag;

我正在尝试通过 Visual Studio 运行 cmd 命令。 我正在使用 createprocces (API) 来运行这个东西 但我不明白为什么它不运行任何东西。

【问题讨论】:

为什么flag 在两个地方设置为true,而从来没有设置为false 【参考方案1】:

dircmd.exe理解的命令,不是你可以执行的程序。

您可以尝试命令cmd /k "dir desktop",正确表示为 C++ 字符串。

例如,

auto execute()
    -> bool

    STARTUPINFO si =  sizeof( si ) ;
    PROCESS_INFORMATION pi = ;
    string f = "cmd /k \"dir desktop\"\0";
    bool const ok = !!CreateProcess( 0, &f[0], 0, 0, false, 0, 0, 0, &si, &pi );
    if( !ok )  return false; 
    WaitForSingleObject(pi.hProcess, INFINITE);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    return true;

注意对 ZeroMemory 的调用如何被 C++ 初始化所取代。

只要让编译器完成它的工作,您就可以获得更短、更清晰、更可能正确且同样高效(可能更多)的代码。双赢。

免责声明:代码未经编译器审查。


如果目的是列出用户桌面文件夹的内容,请注意dir desktop 不会这样做。作为命令解释器中的交互式命令,您可以使用dir %userprofile%\desktop,这也可以通过 Windows 运行对话框工作。根据命令解释器对命令行参数的行为,它可能直接通过CreateProcess 工作,也可能不工作。


通常,在使用 Windows API 级别函数时,最好使用基于 wchar_t 的基于文本的函数,即在包含 &lt;windows.h&gt; 之前定义 UNICODE(或显式使用 ...W 函数)。

【讨论】:

【参考方案2】:

如果您在第一个参数设置为 NULL 的情况下调用 CreateProcess(),那么您必须确保 l1 以要调用的模块名称开头。

由于dir 是命令处理器的内部命令而不是可执行文件,因此您必须使用cmd 作为模块名称并提供其余参数as cmd expects them。

所以尝试以下方法:

 string f = "cmd /c=dir desktop"; 

【讨论】:

以上是关于尝试使用 createprocess (API) 在 cmd throw c++ 上运行命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何为两个单独的 CreateProcess() API 调用打开单独的命令提示符控制台

Win32 API 类似于 CreateProcess,但适用于 bat/cmd/等。 (即使用 PATHEXT)

CreateProcess api 在 Windows 10 上失败,错误代码为 122

UNC 路径上的 VC++ Createprocess

CreateProcess 杀死 PC

Hook CreateProcess