CreateProcess не может запустить приложение

0

Я просто хочу создать процесс для запуска приложения в окне моего кода, как показано ниже:

//init the structure
STARTUPINFOW StartupInfo;
ZeroMemory(&StartupInfo,sizeof(StartupInfo));
StartupInfo.cb = sizeof(StartupInfo);
StartupInfo.dwFlags = STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow = true ;
PROCESS_INFORMATION ProcessInfo;
ZeroMemory(&ProcessInfo,sizeof(ProcessInfo));
DWORD dwExitCode = 0;

LPCWSTR cmdFormat = "xxxxxx"; // this is the applocation path
LPWSTR cmd = new wchar_t[256*sizeof(wchar_t)];
wcscpy_s(cmd, wcslen(cmdFormat)+1,cmdFormat);
int ret = CreateProcessW(cmd,
                         NULL,
                         NULL,
                         NULL,
                         false,
                         NORMAL_PRIORITY_CLASS,
                         NULL,
                         NULL,
                         &StartupInfo,
                         &ProcessInfo);
if(ret)
{
    CloseHandle(ProcessInfo.hThread);
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
    CloseHandle(ProcessInfo.hProcess);
}
if(dwExitCode==0)
{
    DWORD errorcode = GetLastError();
    std::cout<<"ERROR: "<<errorcode<<std::endl;
}

Я использую эту функцию, чтобы создать новый процесс для запуска notepad.exe и некоторых других приложений

Q1: но когда я закрываю приложение, dwExitCode = 0 и код ошибки 1803

Q2: некоторое приложение не может сразу запустить exit

  • 1
    Не по теме, но важно: это не правильный способ использовать strcpy_s . Второй аргумент - это не длина исходной строки, а длина буфера, в который вы копируете.
Теги:
visual-c++

2 ответа

0

Да, я нахожу основную причину, по которой некоторым приложениям нужен какой-то локальный ресурс, поэтому, возможно, нужен родительский стартовый каталог

0

Для меня всегда работает следующая функция:

static int createProcess(string cmdLine, bool isWait, LPDWORD pExitCode)
   {
      STARTUPINFOA si;
      PROCESS_INFORMATION pi;
      ::ZeroMemory(&si, sizeof(si));

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

      // reset last error
      ::SetLastError(0);
      // Start the child process. 
      BOOL bCreateProcess = ::CreateProcessA(NULL, // No module name (use command line)
         (LPSTR) cmdLine.c_str(),  // Command line 
         NULL,                     // Process handle not inheritable
         NULL,                     // Thread handle not inheritable
         FALSE,                    // Set handle inheritance to FALSE
         CREATE_NO_WINDOW,         // No creation flags
         NULL,                     // Use parent environment block
         NULL,                     // Use parent starting directory 
         &si,                      // Pointer to STARTUPINFO structure
         &pi);                     // Pointer to PROCESS_INFORMATION structure

      if(!bCreateProcess)
      {
         // create process failed,
         //Logger::trace(error, getClassName(), "createProcess", getFormattedStringA("create process failed with error:%d, Commad line:'%s',isWait:%d",GetLastError(), cmdLine.c_str(), isWait),"CreateProcess Failed");
         return 0;
      }

      //Logger::trace(info, getClassName(), "createProcess", getFormattedStringA("created process,Commad line:'%s',isWait:%d,Result:%d", cmdLine.c_str(), isWait,bCreateProcess),"Launched Process");
      // Wait until child process exits.
      if(isWait)
      {
         ::WaitForSingleObject(pi.hProcess, INFINITE);
         if(pExitCode)
         {
            ::GetExitCodeProcess(pi.hProcess, pExitCode);
         }
      }
      ::CloseHandle( pi.hProcess );
      pi.hProcess = NULL;
      ::CloseHandle( pi.hThread );
      pi.hThread = NULL;
      return 1; // return non zero. function succeeded
   }
  • 0
    да, я знаю это, но моя проблема в том, что я хочу запустить игру с помощью «createprocess», но она не может запустить другие приложения, все в порядке. Есть некоторые аргументы complier, которые я задавал ранее для игры

Ещё вопросы

Сообщество Overcoder
Наверх
Меню