代码之家  ›  专栏  ›  技术社区  ›  Max

使用参数创建进程(CreateProcess或ShellExecuteEx)的小问题

  •  0
  • Max  · 技术社区  · 16 年前

    相关问题: CreateProcess doesn't pass command line arguments

    在使用CreateProcess(和/或ShellExecuteEx)时,传递参数和传递参数到EXE之间有区别吗?

    myExe.exe /myparam

    代码如下:

    TCHAR Buffer[MAX_PATH];
     DWORD dwRet;
     dwRet = GetCurrentDirectory(MAX_PATH, Buffer);
    
     CString sCmd;
     sCmd.Format ( "%s\\%s", Buffer, command);
     CString sParam( "/myparam" );
     sCmd += " " + sParam;
    
     STARTUPINFO si;
     PROCESS_INFORMATION pi;
    
     ZeroMemory( &si, sizeof(si) );
     si.cb = sizeof(si);
     ZeroMemory( &pi, sizeof(pi) );
    
    
     if (CreateProcess( NULL, sCmd.GetBuffer() , NULL, NULL, TRUE, 0, NULL, Buffer, &si, &pi))
     {
      ::WaitForSingleObject(pi.hProcess, INFINITE);
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
     }
     else
     {
      LPVOID lpMsgBuf = NULL;
      DWORD dw = GetLastError(); 
    
      FormatMessage(
       FORMAT_MESSAGE_ALLOCATE_BUFFER | 
       FORMAT_MESSAGE_FROM_SYSTEM |
       FORMAT_MESSAGE_IGNORE_INSERTS,
       NULL,
       dw,
       MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
       (LPTSTR) &lpMsgBuf,
       0, NULL );
    
      CString msg;
      msg.Format("Failed to start command line (error: %s) : %s\n",lpMsgBuf,sCmd);
    
      AfxMessageBox(msg); 
    
      LocalFree(lpMsgBuf);
     }
    

    我在命令行和资源管理器中尝试了EXE(通过创建一个快捷方式并在目标名称中添加/myparam),现在一切正常。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Brian R. Bondy    16 年前

    如果路径中有空格,请尝试此操作:

    CString sCmd;
    sCmd.Format ( "\"%s\\%s\"", Buffer, command);
    

    或者通过parameters参数传递参数。