關於在bcb中呼叫外部程式的用法

2021-06-28 01:13:58 字數 2856 閱讀 6319

1:用system("")執行(簡單,像在cmd命令列一樣)

2:用winexec()執行

3:用createprocess執行

4:用shellexecute執行.

1)  winexec()

函式原型: uint winexec(lpcstr lpcmdline,uint ucmdshow);

引數說明:(啟用的意思是能接受焦點,即標題欄變成藍色)

lpcmdline:以0結尾的字串,命令列引數。

ucmdshow:新的應用程式的執行方式。其取值如下:

sw_hide 隱藏

sw_maximize 最大化

sw_minimize 最小化,並把z order順序在此視窗之後(即視窗下一層)的視窗啟用

sw_restore 啟用視窗並還原為初始化大小

sw_show 以當前大小和狀態啟用視窗

sw_showdefault 以預設方式執行

sw_showmaximized 啟用視窗並最大化

sw_showminimized 啟用視窗並最小化

sw_showminnoactive 最小化但不改變當前啟用的視窗

sw_showna 以當前狀態顯示視窗但不改變當前啟用的視窗

sw_shownoactivate 以初始化大小顯示視窗但不改變當前啟用的視窗

sw_shownormal 啟用並顯示視窗,如果是最大(小)化,視窗將會還原。第一次執行程式 時應該使用這個值

比如說,我想要用記事本開啟"c:\hdc.txt",以正常方式執行:

winexec("notepad c:\\hdc.txt",sw_shownormal);

如果呼叫成功,這個函式會返回乙個不小於31的值,否則呼叫失敗,其返回值的意義如下:

0 系統記憶體或資源不足

error_bad_format .exe檔案格式無效(比如不是32位應用程式)

error_file_not_found 指定的檔案設有找到

error_path_not_found 指定的路徑沒有找到

這個函式和system()非常類似,只能執行.exe檔案,這樣在windows中有它不盡人意的地方,比如不能用此方法通過關聯的方法開啟檔案,例如winexec("1.html",sw_showna);就不能開啟此文件。

2)shellexecute()

函式原型:

hinstance shellexecute( hwnd hwnd, lpctstr lpoperation, lpctstr lpfile,  

lpctstr lpparameters, lpctstr lpdirectory, int nshowcmd );

引數說明:

hwnd 視窗的控制代碼

lpoperation 進行的操作,如"open","print","explore"分別對應"開啟","列印","遊覽", 也可以為空(""),此時表示進行預設的操作。 lpfile 要操作的檔案。

lpparameters 如果lpfile指定的是乙個可執行檔案則表示引數

lpdirectory 操作進行的目錄

nshowcmd 程式的執行方式,其取值見上例。

如果這個函式呼叫成功,將返回例項的控制代碼,如果不成功,返回值包含錯誤資訊,由於型別比較多,這裡就不一一枚舉了,詳見winapi的幫助。

這樣,上面的例子就可以改變為(假設視窗的控制代碼為handle)

shellexecute(handle,"open","notepad","c:\\hdc.txt","",sw_shownormal);

其實不用那麼複雜,因為.txt的關聯程式就是記事本,所以只要這樣就可以了

shellexecute(handle,"","c:\\hdc.txt","","",sw_shownormal);

這個函式和win9x中的命令列命令"start"類似,不光可以對檔案進行操作,還可以對http、mailto等進行操作。這樣我們就可以設計有超級鏈結風格的程式了。

例如在vb中,我們首先宣告此函式(可由vb自帶的api遊覽器得到):

public declare function shellexecute lib "shell32.dll" alias "shellexecutea" (byval hwnd as long, byval lpoperation as string, byval lpfile as string, byval lpparameters as string, byval lpdirectory as string, byval nshowcmd as long) as long

然後放置兩個label,設定其屬性為:

name lbhomepage lbemail

caption mailto:[email protected]

並把字型改為藍色有下劃線,然後分別在兩個label的click事件中加入以下**:

shellexecute(me.hwnd,"",lbhomepage.caption,"","",sw_shownormal);

shellexecute(me.hwnd,"",lbemail.caption,"","",sw_shownormal);

ok!試試看,如何?夠酷的吧!

從上面可看出,shellexecute的功能要強得多,並且可以完全替代winexec(),事實上,winexec()也是為了和以前版本相容而保留,所以,我們要盡量使用shellexecute()。其實在winapi中,還有乙個函式shellexecuteex() ,但其使用複雜,又不支援windows nt,所以這裡就不作介紹了,有興趣的可以自已查詢winapi幫助。

QT中呼叫外部程式的方法

上個月有人寫信問我這個問題,當時做了比較詳細的回答,把回答內容放上來,也許對其它 人會有些用處的吧。有些地方我的理解可能也不正確,歡迎指正 問題 回答 1 完全可以使用fork,execv函式,其實qprocess類只是對這些底層函式的封裝而 已,但是考慮到使用qprocess的話,不需要自己處理程...

QT中呼叫外部程式 QProcess的使用

本文 http blog.csdn.net waderchan archive 2009 05 19 4199913.aspx 執行介面如下 程式共包含以下有乙個檔案 view plain copy to clipboard print?main.cpp include process.h incl...

QT中呼叫外部程式 QProcess的使用

程式共包含以下有乙個檔案 main.cpp include process.h include intmain intargc,char argv process.h ifndef process h define process h include classqlabel classqlineed...