1. 程式人生 > >BCB用API函式WinExec在BCB內執行外部程式

BCB用API函式WinExec在BCB內執行外部程式

API(Application Programming Interface,應用程式程式設計介面)是一套用來控制Windows的各個部件(包括從視窗的外觀到為一個新程序分配的記憶體)的外觀和行為的一套預先定義的Windows函式。在某種程度上API很象Windows的底層程式碼,其它的程式語言只是提供一種能自動而且更容易訪問API的方法。Windows API 函式中包含了成千上萬的函式、例程、型別和常數定義它大大擴充套件了程式的功能。 在BCB中呼叫API函式一般不用引用標頭檔案,也不需要宣告。

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    最小化視窗,活動狀態給令一個視窗
    SW_RESTORE    用原來的大小和位置顯示一個視窗,同時令其進入活動狀態     SW_SHOW    用當前的大小和位置顯示一個視窗,同時令其進入活動狀態     SW_SHOWMAXIMIZED    最大化視窗,並將其啟用     SW_SHOWMINIMIZED    最小化視窗,並將其啟用     SW_SHOWMINNOACTIVE    最小化一個視窗,同時不改變活動視窗     SW_SHOWNA    用當前的大小和位置顯示一個視窗,不改變活動視窗     SW_SHOWNOACTIVATE    用最近的大小和位置顯示一個視窗,同時不改變活動視窗     SW_SHOWNORMAL    與SW_RESTORE相同


下面這個程式段就是在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);