C 呼叫外部程式

2021-06-04 03:14:51 字數 4796 閱讀 9946

關於三個sdk函式:winexec, shellexecute,createprocess的其他注意事項:

定義標頭檔案

必須定義以下兩個標頭檔案:

#include // 可替換為 windows.h

#include

如果定義了標頭檔案 #include 的話就不必定義 #include 了。

定義路徑

c++中所表示的路徑要用 " \\ "而不是平常所用的" \ ",所以以上三個函式表示路徑都為:disk:\\directory\\...\\filename

winexec("d:\\program files\\test\\test.exe",sw_showmaximized);

shellexecute(null,"open","c:\\test.txt",null,null,sw_shownormal);

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

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

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

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

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

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

(4)、不能執行*.txt檔案或"www.baidu.com"

2、呼叫api:

uint winexec(

lpcstr lpcmdline, // command line

uint ucmdshow // window style

);

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

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

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

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

(3)、它無論啟動控制台程式還是windows程式都只做你想要做的事。

它的不足之處:

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

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

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

(4)、不能執行*.txt檔案或"

"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.vccode.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.vccode.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.vccode.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 directoryname

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系統程式設計 >>,它的「程序」部份作了很詳盡的說明。 

例程:

#include#include#includevoid main()

四、c函式:

1     system()

2     spawn()   函式系列

3     exec()   函式系列

C 呼叫外部程式

process.enableraisingevents true 是否激發關閉事業 new eventhandler process exited process.exittime 獲取程序退出時間 process.ha ited 程序是否已終止 process.kill 關閉當前程序 proces...

c 呼叫外部程式

留底 system.diagnostics.processstartinfo info new system.diagnostics.processstartinfo info.filename vmdotnet v2.0.50727 fetionvm.exe 這裡是你要呼叫到的外部程式 info....

c 呼叫外部程式

在編寫程式時經常會使用到呼叫可執行程式的情況,本文將簡單介紹c 呼叫exe的方法。在c 中,通過process類來進行程序操作。process類在system.diagnostics包中。using system.diagnostics process p process.start notepad...