Windows平台開發 四種啟動其它程式的方法

2021-04-13 06:19:07 字數 3831 閱讀 6947

有時我們的程式需要啟動其它程式,可能是為了利用它已有的功能,也可能是為了達到某種需要。那麼怎樣來啟動我們需要的程式呢?

我暫時知道有4種方法:

1、呼叫api: int system( const char *command );

你可以傳入一命令,啟動某個程式。如"ping www.vczx.com", "yourexe"等等

不過這裡有幾點要值得注意:

(1)、他不會立即返回,直到你啟動的程式執行完成。

(2)、如果你啟動是windows程式,它仍然會啟動乙個控制台,這就給人感覺太差勁了,但如果本身是控制台的,而且又需要等待它的完成,那這將是比較好的選擇。

(3)、它的返回值代表是否執行成功以及程式的退出碼。

2、呼叫api:

uint winexec(

lpcstr lpcmdline,  // command line

uint ucmdshow      // window style );

這個api與api:system同樣的簡單,都是使用命令列型式。

不過它與api:system相比,有幾個優點:

(1)、它將啟動了乙個新程序,並且立即返回,因此你的程式無需等待。

(2)、它多了乙個引數:ucmdshow,通過它你可以一定程度上控制項窗體的顯示,比如讓它後台執行而不顯示出來。

(3)、它無論啟動控制台程式還是windows程式都只做你想要做的事,不會有上面啟動windows程式時先啟動控制台視窗的動作。

它的不足之處:

(1)、它完全與本程序脫離,無法做些必要的控制

(2)、無法得知啟動的程式是否退出。

(3)、得不到啟動的程式的退出碼。 等等

3、呼叫:

hinstance shellexecute(

hwnd hwnd,

lpctstr lpverb,

lpctstr lpfile,

lpctstr lpparameters,

lpctstr lpdirectory,

int nshowcmd );

它也有winexec同樣的缺點。

它雖然傳回乙個hinstance,但他並不是真正的控制代碼,我們僅能拿它來做一些錯誤值檢查。

但它的功能比前兩者更強大,它執行系統的shell命令。

1、2中如果傳入「xx.txt」,它們將不能成功執行,shellexecute卻能很好地執行,它將啟動乙個預設的文字處理程式來開啟它。

1、2中如果傳入「www.vczx.com」,將不能成功執行,而shellexecute卻能很好地執行,它將啟動乙個預設瀏覽器來開啟這個**。

引數講解:

引數1 hwnd:一窗體控制代碼,將作為啟動的程式的父窗體。

引數2 lpverb:你想執行的操作(edit 、explore、find、open、print、properties),你也可以傳入null值,它將執行預設操作(win2000以前與以後處理略有差別,請見msdn)。

引數3 lpfile:一檔名或操作的物件。

引數4 lpparameters:如果lpfile是一可執行檔案,這個將作為它的引數。它的格式由執行的操作決定。而且當lpfile為一document檔案時,此引數需為null。

引數5 lpdirectory:指定它的工作目錄。

引數6 nshowcmd:窗體顯示的控制。

以下是幾個例子:

//啟動乙個dos命令, 啟動windows程式相同

::shellexecute(this->getsafehwnd(), null, "ping", "www.vczx.com", null, sw_shownormal);

//開啟乙個檔案

::shellexecute(this->getsafehwnd(), "open", "readme.txt", null, null, sw_shownormal);

//上面的動詞可傳可不傳,但如果"readme.txt"為"readme.bat"那就得指定,否則將會當命令執行,而不是開啟它。

//可開啟目錄

::shellexecute(this->getsafehwnd(), "open", "c:", null, null, sw_shownormal);

//可開啟網頁

::shellexecute(this->getsafehwnd(), "open", "www.vczx.com", null, null, sw_shownormal);

//瀏覽乙個目錄

shellexecute(handle, "explore", "c:"null, null, sw_shownormal);

//檢視乙個檔案或目錄的屬性

//使用shellexecuteex,實現請見所附原始碼對應部分

如果沒有特殊的控制要求,它己能為我們做很了,但當我們一定要能控制項這個啟動的程序時,那我們就得使用第4點了。

4:呼叫api:

bool createprocess(

lptstr lpcommandline,                      // command line string

lpsecurity_attributes lpprocessattributes, // sd

lpsecurity_attributes lpthreadattributes,  // sd

bool binherithandles,                      // handle inheritance option

dword dwcreationflags,                     // creation flags

lpvoid lpenvironment,                      // new environment block

lpctstr lpcurrentdirectory,                // current directory name

lpstartupinfo lpstartupinfo,               // startup information

lpprocess_information lpprocessinformation // process information );

往往看到這個函式就讓人生畏,它引數多,而且引數型別也如此莫生。是的,正是因為如此它才功能強大!

但不要怕,作為一般使用,非常簡單!下面便是乙個簡單的例子(啟動記事本):

startupinfo startinfo;

process_information pinfo;

//對程式的啟動資訊不作任何設定,全部清0

memset(&startinfo,0,sizeof(startupinfo));

startinfo.cb = sizeof(startupinfo);//設定結構的大小

bool ret=createprocess(

null, //啟動程式路徑名

"notepad.exe", //引數(當exename為null時,可將命令放入引數前)

null,  //使用預設程序安全屬性

null,  //使用預設執行緒安全屬性

false,     //控制代碼不繼承

normal_priority_class, //使用正常優先順序

null,  //使用父程序的環境變數

null,  //指定工作目錄

&startinfo, //子程序主視窗如何顯示

&pinfo); //用於存放新程序的返回資訊

這樣在建立成功這後我們就可以從pinfo中找到它的:程序控制代碼,執行緒控制代碼,程序id,執行緒id

想很好地掌握createprocess,可參見人民郵電出版社出版的<< windows系統程式設計 >>,它的「程序」部份作了很詳盡的說明。 

Activity四種啟動模式

launchmode在多個activity跳轉的過程中扮演著重要的角色,它可以決定是否生成新的activity例項,是否重用已存在的activity例項,是否和其他activity例項公用乙個task裡。這裡簡單介紹一下task的概念,task是乙個具有棧結構的物件,乙個task可以管理多個acti...

Activity四種啟動模式

activity的啟動模式可以通過androidmanifest.xml檔案中的元素的屬性來指定,一共有4中模式 android name activitymain android launchmode singletask 1 standard 2 singletop 3 singletask 4...

Android activity的四種啟動模式

1 standard 預設模式,無論何時,啟動乙個activity時,都會在task棧頂建立乙個該activity的新例項 2 singletop 啟動乙個activity時,如果task棧頂是該activity的例項,則重用該例項,並呼叫onnewintent 方法 如果task棧頂不是該acti...