Как урезать пространство из lpApplicationName функции CreateProcessW? - PullRequest
0 голосов
/ 12 октября 2019

Я использую функцию CreateProcessW для создания процесса. В эту функцию, передавая первый параметр, т. Е. LpApplicationName с некоторыми пробелами, как показано ниже:

В пути ниже (pszExePath) есть пробелы, потому что этот процесс не создается.

pszExePath = L"C:\\Program Files\\Common Files\\Installer\\emrinst.exe";

Я пытался обрезать пространство, используя приведенные ниже строки, но все еще сталкиваюсь с проблемой.

pszExePath = L"\"";
pszExePath += L"C:\\Program Files\\Common Files\\Installer\\emrinst.exe";
pszExePath += L"\"";

Как обрезать пространство из lpApplicationName функции CreateProcessW?

Ниже приведен обновленный код:

pszExePath = L"C:\\Program Files\\Common Files\\Installer\\emrinst.exe";
strCommandLine = "C:\\Testfolder\\Program Files\\Common Files\\Apps\\emarmain\\emr-test_folder\\Millinnium Files\\test\\test.inf";

std::wstring strFullPath = L"";
strFullPath += pszExePath;
strFullPath += pszCmdLine;


dwExitCode = ::CreateProcessW(NULL, (LPWSTR)strFullPath.c_str(),
            0, 0, FALSE, NORMAL_PRIORITY_CLASS, 0,
            pszCurrentDirectory, &si, &pi);

Я все еще получаю сообщение об ошибке, думаю, оно превышает размер второго параметра "lpCommandLine" в 32 768 символов. Есть ли способ увеличить размер? А также правильный ли мой фрагмент кода?

Ответы [ 2 ]

3 голосов
/ 12 октября 2019

Поскольку вы без сомнения читаете документацию :

Если вы используете длинное имя файла с пробелом, используйте строки в кавычках, чтобы указать, где имя файлазаканчивается и аргументы начинаются;в противном случае имя файла неоднозначно.

Итак, вы правильно поняли эту часть, но вы не можете объединить строки C таким образом. Вместо этого вы можете сделать:

#include <string>

std::wstring cmdline = L"\"";
cmdline += L"C:\\Program Files\\Common Files\\Installer\\emrinst.exe";
cmdline += L"\"";

CreateProcess (NULL, &cmdline [0], ...);

В качестве альтернативы вы можете передать путь к приложению в качестве первого параметра CreateProcess без кавычек.

0 голосов
/ 13 октября 2019

В соответствии с документацией MSDN для CreateProcess (Unicode) и кодом в вопросе:

1) Добавьте двойные кавычки в путь EXE и командную строку.

2) Добавьте пробел между pszExePath и strCommandLine.

3) Примечание. Для этого решения требуется C ++ 11, поскольку для CreateProcess в качестве параметра lpCommandLine требуется строка не только для чтения. В предыдущих версиях C ++ используйте _wcsdup для дублирования строки и вызовите free для ее освобождения.

    std::wstring pszExePath     = L"C:\\Program Files\\Common Files\\Installer\\emrinst.exe";
    std::wstring strCommandLine = L"C:\\Testfolder\\Program Files\\Common Files\\Apps\\emarmain\\emr-test_folder\\Millinnium Files\\test\\test.inf";

    std::wstring strFullPath = L"\"" + pszExePath + L"\"" + L" " + L"\"" + strCommandLine + L"\"";

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

    BOOL result = ::CreateProcessW(NULL, &strFullPath[0], 0, 0, FALSE, NORMAL_PRIORITY_CLASS, 0, pszCurrentDirectory, &si, &pi);    

    if (result)
    {
       CloseHandle(pi.hThread);
       CloseHandle(pi.hProcess);
    }

Редактировать: В качестве альтернативы вы можете попробовать ShellExecuteW (обратите внимание на двойные кавычки в обоих путях).

std::wstring pszExePath = L"\"C:\\Program Files\\Common Files\\Installer\\emrinst.exe\"";
std::wstring strCommandLine = L"\"C:\\Testfolder\\Program Files\\Common Files\\Apps\\emarmain\\emr-test_folder\\Millinnium Files\\test\\test.inf\"";

ShellExecute(0, L"open", pszExePath.c_str(), strCommandLine.c_str(), pszCurrentDirectory, SW_NORMAL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...