【问题标题】:Beginner C++ CreateProcess () Error 2初学C++ CreateProcess() 错误2
【发布时间】:2015-12-31 18:59:55
【问题描述】:

我正在尝试创建一个向 cmd.exe 发送命令并接收错误 2 的进程, 为什么?有可能吗?怎么样?

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    String pathexe = "C:\Windows\system32\cmd.exe";
    String command= "notepad.exe";

    if(!CreateProcess(
            pathexe.c_str(),  // lpApplicationName
            command.c_str(),  // lpCommandLine
            NULL,   // lpProcessAttributes
            NULL,   // lpThreadAttributes
            FALSE,  // bInheritHandles
            0,      // dwCreationFlags
            NULL,   // lpEnvironment
            NULL,   // lpCurrentDirectory
            &si,    // lpStartupInfo
            &pi     // lpProcessInformation
            ))
    {
        AnsiString error = GetLastError();
        ShowMessage("Error: " + error);
    }
    WaitForSingleObject( pi.hProcess, INFINITE );
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

PD:1)假设您可以为此目的使用CreateProcess(),我不应该使用ShellExecute()或system()。 2)我在论坛上看过,找不到解决这个错误的办法,类似问题有很多答案但没有解决错误,建议其他功能,或与路由命令混合使用。 3)我不认为该问题允许,因为我在清单时构建。 4) 我目前使用 C++ Builder,在 win7 中,32 位但不重要。 5)我猜这个问题将被投票为否定和重复(像往常一样),但建议的测试示例也会收到错误。 谢谢大家

初步结论:

错误2:系统找不到指定的文件。

链接功能:https://msdn.microsoft.com/es-es/library/windows/desktop/ms679360(v=vs.85).aspx 链接错误:https://msdn.microsoft.com/es-es/library/windows/desktop/ms681382(v=vs.85).aspx

出现错误 2:检查语法、文件路径和存在。

作品:

STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));

    String command = "notepad.exe";

    if(!CreateProcess(
            NULL,   // lpApplicationName
            commmand.c_str(), // lpCommandLine
            NULL,   // lpProcessAttributes
            NULL,   // lpThreadAttributes
            FALSE,  // bInheritHandles
            0,      // dwCreationFlags
            NULL,   // lpEnvironment
            NULL,   // lpCurrentDirectory
            &si,    // lpStartupInfo
            &pi     // lpProcessInformation
            ))
    {
        AnsiString error = GetLastError();
        ShowMessage("Error: " + error);
    }
    WaitForSingleObject( pi.hProcess, INFINITE );
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );

这个例子也适用于 exe

String command = "cd C:\\sample\\calc.exe";

但是没有 cmd 的通用命令,必须有一种方法可以将命令发送到 cmd 为:

notepad.exe && cd C:\sample\ && sample1.txt

感谢大家

【问题讨论】:

  • 你知道GetLastError返回一个整数值,而不是一个字符串?
  • 你确定吗?如果我尝试获取 GetLastError() 的 int,ShowMessage() 上不会显示错误,但如果我尝试 AnsiString 显示 2...
  • 点击指向 MSDN 参考的链接。它返回一个DWORD。如果您尝试在字符串文字和整数之间使用+(例如在"Error: " + 2 中),那么您就是在进行指针运算。
  • "C:\Windows\system32\cmd.exe" 应该是"C:\\Windows\\system32\\cmd.exe"
  • 通过命令解释器 cmd.exe 执行 notepad.exe 很尴尬。我假设 cmd.exe 期望其可执行映像 ("C:\\Windows\\system32\\cmd.exe") 的路径作为命令行上的第一个参数。您正在传递"notepad.exe"。如果您同时提供应用程序名称和命令行,请将应用程序名称作为第一个参数复制到命令行,并正确引用它。或者干脆省略应用程序名称,只传递命令行。

标签: c++ winapi command createprocess c++builder-xe


【解决方案1】:

您正在尝试运行此命令:

cmd notepad

(你的做法也不对;lpCommandLine 参数应该包括整个字符串,而不仅仅是notepad,而且你没有正确引用反斜杠。)

但是即使你解决了这些问题,它也不会起作用,因为你的语法错误。你会发现在命令行输入也行不通!

请尝试:

String pathexe = "C:\\Windows\\system32\\cmd.exe";
String command= "cmd /c notepad.exe";

/c 选项表示“运行此命令”。如果您希望命令窗口在命令完成后保持打开状态,则可以改用 /k,尽管程序这样做并不常见。

最后一点:我在这里假设notepad 只是更复杂命令的替代品。如果您真的想运行记事本或任何其他可执行文件,则根本不应该调用 cmd.exe

String command= "notepad";

if(!CreateProcess(
        NULL,  // lpApplicationName
        command.c_str(),  // lpCommandLine
        ...

如果您需要运行内置命令或复合命令行,您只需要调用cmd.exe

(实际上,即使在这些情况下,调用 cmd.exe 也被认为是不好的做法;在 Windows 中,通常希望您通过 API 为自己做这种事情,而不是将工作交给命令解释器。但是有边缘情况,您的里程可能会有所不同。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多