Небольшая проблема с созданием процесса (CreateProcess или ShellExecuteEx) с параметрами - PullRequest
0 голосов
/ 08 июля 2010

Смежный вопрос: CreateProcess не передает аргументы командной строки .

Есть ли разница между передачей аргумента и передачей параметра в EXE при использовании CreateProcess (и / или ShellExecuteEx)?

Я пытаюсь назвать что-то вроде:

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);
 }

Из того, что я понимаю из другого потока и MSDN, это то, что он должен работать правильно и вызывать EXE с параметром; выполнение приведенного выше кода без добавления "/ myparam" работает так, как должно.

Я попробовал EXE из командной строки и из Проводника (создав ярлык и добавив / myparam к имени цели), и он работает нормально.

1 Ответ

0 голосов
/ 08 июля 2010

Попробуйте, если в пути есть пробелы:

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

Или передайте параметры через аргумент параметров.

...