VC中調用其它程序的三種方法總結

WinExec 兩個參數,前一個指定路徑,後一個指定顯示方式。
      UINT WinExec(          
            LPCSTR lpCmdLine,   // 命令路徑  
            UINT uCmdShow         // 顯示方式  
      )
 
WinExec("Notepad.exe", SW_SHOW);  // 打開記事本
WinExec("D://Program Files//Test//Test.exe",SW_SHOWMAXIMIZED); // 以最大化的方式打開Test.exe
 
需要注意的是若用 SW_SHOWMAXMIZED 方式去加載一個無最大化按鈕的程序,譬如Neterm,Calc 等等,就不會出現正常的 窗體,但是已經被加到任務列表裏了。可以直接在執行命令後面帶參數。
 
ShellExecute 可以指定工作目錄,並且還可以尋找文件的關聯直接打開不用加載與文件關聯的應用程序,ShellExecute還可以打開網頁,啓動相應的郵件關聯發送郵件等等。
調用該函數需#include <shellapi.h>
 
HINSTANCE ShellExecute(       
HWND hwnd,           //父窗口句柄       
LPCTSTR lpOperation,   //操作, 打開方式 "edit","explore","open","find","print","NULL"       
LPCTSTR lpFile,         //文件名,前面可加路徑       
LPCTSTR lpParameters,   //參數       
LPCTSTR lpDirectory,    //默認文件夾       
INT nShowCmd          //顯示方式 );
 
ShellExecute(NULL,"open","C://Test.txt",NULL,NULL,SW_SHOWNORMAL); // 打開C:/Test.txt 文件;
ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOWNORMAL); //用默認瀏覽器打開鏈接;
ShellExecute(NULL,NULL,"IEXPLORE.EXE","http://www.google.com" , NULL, SW_SHOWDEFAULT ); //用指定瀏覽器打開鏈接;     
 
CreateProcess 一共有十個參數,不過大部分都可以用NULL代替,它可以指定進程的安全屬性,繼承信息,類的優先級等等。如果我們要得到足夠多的關於新的進程的信息,控制新的進程的細節屬性,若要達到這些目的,我們就需要使用CreateProcess函數了。
 
      BOOL CreateProcess(       
      LPCTSTR lpApplicationName, //執行程序名       
      LPTSTR lpCommandLine,  // 參數行       
      //下面兩個參數描述了所創建的進程和線程的安全屬性,如果爲NULL則使用默認的安全屬性 
      LPSECURITY_ATTRIBUTES lpProcessAttributes,  // process security attributes
      LPSECURITY_ATTRIBUTES lpThreadAttributes,   // thread security attributes
      BOOL bInheritHandles,  // 繼承標誌       
      DWORD dwCreationFlags, // 創建標誌       
      LPVOID lpEnvironment,  // 環境變量       
      LPCTSTR lpCurrentDirectory,   // 運行該進程的初始目錄       
      LPSTARTUPINFO lpStartupInfo,  // 用於在創建子進程時設置各種屬性       LPPROCESS_INFORMATION lpProcessInformation //用於在進程創建後接受相關信息);
 
// 啓動子進程    
PROCESS_INFORMATION pi;    
STARTUPINFO si = {sizeof(si)};    
BOOL ret = CreateProcess(pszExeFile, (LPTSTR)pszCmdLine, NULL, NULL, FALSE, HIGH_PRIORITY_CLASS, NULL, NULL, &si, &pi);
if(ret)
{    
// 關閉子進程的主線程句柄    
CloseHandle(pi.hThread);    
// 關閉子進程句柄    
 CloseHandle(pi.hProcess);}
 
如果有參數,則使pszExeFile=NULL,pszCmdLine="Cmd.exe param..."
 
注:
如果CreateProcess()函數調用成功,則調用CloseHandle()函數關閉所返回的子進程的句柄和子進程主線程的句柄。爲什麼要這樣做呢?   
在創建一個新進程時,系統會爲該進程建立一個進程內核對象和一個線程內核對象,而每個內核對象都有一個使用計數,系統會爲這兩個對象賦予初始的使用計數:1,在Createprocess()函數返回之前,它將打開創建的進程對象和線程對象,並將每個對象與進程和線程相關的句柄放在其最後一個參數PROCESS_INFORMATION結構體的相應成員中。當CreatePoress()函數在其內部打開這些對象時,每個對象的使用計數就變爲2,如果在父進程中不需要使用子進程的這兩個句柄,則可以調用CloseHandle()函數關閉他們,系統將子進程的進程內核對象和線程內核對象的計數減1,當子進程終止運行時,系統會將這些使用計數減1,這時子進程的進程內核對象和線程對象計數就變爲0了,這來兩個內核對象就能夠釋放了。
所以在編程時,當不需要操作這些內核對象時,總是應該調用CloseHandle函數關閉它們。
發佈了38 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章