Windows API - CreateProcess() path with space

前端 未结 5 1969
春和景丽
春和景丽 2021-01-11 13:57

How do I pass path with space to the CreateProcess() function?

The following works

STARTUPINFO si;
            PROCESS_INFORMATION pi;

            Z         


        
5条回答
  •  情歌与酒
    2021-01-11 14:00

    Docs are unclear, but it seems possible that if you include a space you must allow param 2 to define the full path.

    The lpApplicationName parameter can be NULL. In that case, the module name must be the first white space–delimited token in the lpCommandLine string. If you are using a long file name that contains a space, use quoted strings to indicate where the file name ends and the arguments begin; otherwise, the file name is ambiguous.

    Have you tried this variation?

    CreateProcess(NULL,    // No module name (use command line)
                  _T("\"c:\\master installer\\ew3d.exe\" /qr"),//argv[1],        // Command line
                  NULL,           // Process handle not inheritable
                  NULL,           // Thread handle not inheritable
                  FALSE,          // Set handle inheritance to FALSE
                  0,              // No creation flags
                  NULL,           // Use parent's environment block
                  NULL,           // Use parent's starting directory 
                  &si,            // Pointer to STARTUPINFO structure
                  &pi )           // Pointer to PROCESS_INFORMATION structure
                 ) 
    

    EDIT: The following worked for me (dwError is 0). My project is built with multibyte charset.

    LPTSTR szCmdLine = _tcsdup(TEXT(
        "\"C:\\Program Files\\adobe\\Reader 8.0\\reader\\acrord32.exe\" /qr"));
    CreateProcess(NULL,
                  szCmdLine,
                  NULL,           // Process handle not inheritable
                  NULL,           // Thread handle not inheritable
                  FALSE,          // Set handle inheritance to FALSE
                  0,              // No creation flags
                  NULL,           // Use parent's environment block
                  NULL,           // Use parent's starting directory 
                  &si,            // Pointer to STARTUPINFO structure
                  &pi            // Pointer to PROCESS_INFORMATION structure
                 );     // This works. Downcasting of pointer to members in general is fine.
    
    DWORD error = GetLastError();
    

提交回复
热议问题