BCB用API函式WinExec在BCB內執行外部程式
1:用system("")執行(簡單,像在CMD命令列一樣)
2:用WinExec()執行
3:用CreateProcess執行
4:用ShellExecute執行.
1.WinExec函式是API函式
BCB中對WinExec函式定義在winbase.h中,函式宣告為:
WinExec(
IN LPCSTR lpCmdLine,
IN UINT uCmdShow
);
lpCmdLine:要執行的命令列
uCmdShow:定義了以怎樣的形式啟動程式的常數值,它與ShowWindow函式的 nCmdShow 引數總結的設定相同:
SW_HIDE 隱藏視窗,活動狀態給令一個視窗 SW_MINIMIZE 最小化視窗,活動狀態給令一個視窗
下面這個程式段就是在BCB程式內用IE瀏覽器開啟網頁
AnsiString URL_="Explorer.exe " + ADOTable2->FieldValues["URL"];
const char *my=URL_.c_str(); /////////將AnsiString轉換為Char
WinExec(my,SW_SHOWMAXIMIZED); 呼叫畫圖: AnsiString URL="mspaint.exe " + CurrentFile;
char *chr = URL.c_str();//引數
WinExec(chr,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.
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 http://bcbtop.126.com 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幫助。
例子:呼叫畫圖:ShellExecute(Handle,"open","mspaint",chr,0,SW_SHOW);