CreateProcess无法运行应用程序

时间:2014-02-26 04:56:25

标签: c++ windows visual-c++

我只想创建一个在windows上运行应用程序的进程,如下所示:

//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's 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:某些应用程序无法立即退出

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's environment block
         NULL,                     // Use parent's 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
   }

答案 1 :(得分:0)

是的我找到根本原因某些应用程序需要一些本地资源,因此可能需要父级的起始目录