2011年12月6日 星期二

執行外部程式 -- CreateProcess(),ShellExecuteEx()

要執行外部程式,ShellExecute() 與 WinExec() 都是較為簡單的方法,
但卻無法進一步掌握新的process的狀態
 
如果要進一步掌握新的process執行的狀態,可以呼叫 CreateProcess() 或 
ShellExecuteEx(),並透過 WaitForSingleObject 以等待新的process執行完後
,再繼續下一步驟,以控制程式同步
  • ShellExecuteEx() 的例子
 SHELLEXECUTEINFO   ShExecInfo   =   {0}; 
 ShExecInfo.cbSize   =   sizeof(SHELLEXECUTEINFO); 
 ShExecInfo.fMask   =   SEE_MASK_NOCLOSEPROCESS; 
 ShExecInfo.hwnd   =   NULL; 
 ShExecInfo.lpVerb   =   NULL; 
 ShExecInfo.lpFile   =    "c:\\MyProgram.exe ";                         
 ShExecInfo.lpParameters   =    " ";   //可以加參數          
 ShExecInfo.lpDirectory   =   NULL; 
 ShExecInfo.nShow   =   SW_SHOW; 
 ShExecInfo.hInstApp   =   NULL;             
 ShellExecuteEx(&ShExecInfo); 
 WaitForSingleObject(ShExecInfo.hProcess,INFINITE); 
  
  • CreateProcess()函數的例子:  
 PROCESS_INFORMATION   piProcInfo;    
 STARTUPINFO   siStartInfo; 
  
 //   Set   up   members   of   STARTUPINFO   structure. 
 siStartInfo.cb   =   sizeof(STARTUPINFO);    
 siStartInfo.lpReserved   =   NULL; 
 siStartInfo.lpReserved2   =   NULL;    
 siStartInfo.cbReserved2   =   0; 
 siStartInfo.lpDesktop   =   NULL;    
 siStartInfo.dwFlags   =   0; 
  
  
 //   Create   the   child   process. 
 CreateProcess( 
 NULL, 
 strCmdLine.c_str(), 
 NULL,   //   process   security   attributes 
 NULL,   //   primary   thread   security   attributes 
 0,   //   handles   are   inherited 
 0,   //   creation   flags 
 NULL,   //   use   parent 's   environment 
 NULL,   //   use   parent 's   current   directory 
 &siStartInfo,   //   STARTUPINFO   pointer 
 &piProcInfo);   //   receives   PROCESS_INFORMATION 
  
 //   Wait   for   the   processs   to   finish 
 DWORD   rc   =   WaitForSingleObject( 
    piProcInfo.hProcess,   //   process   handle 
    INFINITE);    
 
 
 

沒有留言:

張貼留言