无法使用参数启动进程

Cannot start process with arguments

本文关键字:启动 进程 参数      更新时间:2023-10-16

我试图用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比旧的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是一个等待发生的错误。当前工作目录由进程中的所有线程共享。它可以随时更改。永远不要用它。相反,查询当前正在执行的模块的路径,或从注册表中检索安装路径,等等。