【问题标题】:Cannot start process with arguments无法使用参数启动进程
【发布时间】:2016-08-03 16:41:59
【问题描述】:

我尝试使用来自 C++ 应用程序的参数启动一个新进程,但它不起作用 - 它只是在没有这些参数的情况下启动进程

这是我的代码

void Launch(HWND hWnd) {
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    char bff[512];
    size_t size = strlen(bff) + 1;
    wchar_t* bff2 = new wchar_t[size];
    size_t outSize;
    memset(&si, 0, sizeof(si));
    si.cb = sizeof(si);
    sprintf_s(bff, "-rc:eu -lac:eng");
    mbstowcs_s(&outSize, bff2, size, bff, size-1);

    char* pathe = NULL;
    size_t size3 = MAX_PATH;
    pathe = _getcwd(pathe, size3);
    std::string myString(pathe);
    std::size_t found = myString.find_last_of("\\");

    wchar_t* txt = L"\\Client.exe";
    std::wstring stre(txt);
    std::wstring stemp = s2ws(myString) + stre;
    return;
    if (!CreateProcess(stemp.c_str(), bff2, NULL, NULL, 0, 0, NULL, NULL, &si, &pi)) {
        MessageBox(hWnd, L"Cannot launch Client!", L"Error", 0);
        return;
    }

    MessageBox(hWnd, L"Client should start soon!", L"Success!", 0);
}

谢谢

【问题讨论】:

  • 什么,关于再次阅读CreateProcess() 文档?您应该快速找出问题所在。
  • 是不是应该在createprocess函数的第一个参数中传入参数?
  • 不,但bff 也应该使用宽字符。
  • 我正在传递 bff2,那是 Widechar,不是吗?它包含我对应用程序的论点
  • char bff[512]; size_t size = strlen(bff) + 1; 不正确; bff 的内容在您明确设置之前是未定义的。但是由于您希望size 成为wchar_t 数组的大小,您可能只想说wchar_t bff2[512];。而且您似乎只是在使用它来转换文字 C 字符串;为什么不使用宽文本 C 字符串 (L"...")?即便如此,既然您使用的是 C++,并且在函数后面使用了wstring,为什么不到处使用wstring

标签: c++ winapi process


【解决方案1】:

CreateProcess 比旧的 C 约定更通用,可以将可执行映像的名称作为argv[0] 传递给新创建的进程。它允许您传递任意命令行参数。 lpApplicationName 指定可执行映像,lpCommandLine 传递给argv,以argv[0] 开头。

通常不需要填充这两个参数。到目前为止,调用CreateProcess 的最常见方法是将NULL 作为lpApplicationName 参数传递,并将整个命令行(包括正确引用的可执行映像的完全限定路径名)作为lpCommandLine 参数。

您的调用本质上应该如下所示(伪代码):

CreateProcessW(NULL, L"\"<path to exe>\\Client.exe\" -rc:eu -lac:eng", ...);


注意:您的大多数字符串处理也是错误的。你应该一直使用wchar_t,更好的是std::wstring。除此之外,调用_getcwd 是一个等待发生的错误。当前工作目录由进程中的所有线程共享。它可以随时更改。永远不要使用它。相反,查询当前正在执行的模块的路径,或者从注册表中检索安装路径等。

【讨论】:

  • 您可能还应该讨论被误导的字符串处理。误解无处不在,误用CreateProcess()只是最明显的。
猜你喜欢
  • 2011-08-11
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 2018-10-24
相关资源
最近更新 更多