1,WinExec():
WinExec主要運行EXE文件,不能運行其他類型的文件。不用引用特別單元。
原型:UINT WinExec(exePath,ShowCmd)
示例,我想要用記事本打開"C:\HDC.TXT",以正常方式運行:WinExec(pChar('notepad c:\taoyoyo.txt'),SW_SHOWNORMAL);
參數說明:
--xePath:命令行參數。注意,要用pChar轉化一下。
--ShowCmd:外部程序的運行方式。其取值如下:
----SW_HIDE 隱藏
----SW_MAXIMIZE 最大化
----SW_MINIMIZE 最小化,並把Z order順序在此窗口之后(即窗口下一層)的窗口激活
----SW_RESTORE 激活窗口並還原為初始化大小 SW_SHOW 以當前大小和狀態激活窗口
----SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態
----SW_SHOWDEFAULT 以默認方式運行
----SW_SHOWMAXIMIZED 激活窗口並最大化
----SW_SHOWMINIMIZED 激活窗口並最小化
----SW_SHOWMINNOACTIVE 最小化但不改變當前激活的窗口
----SW_SHOWNA 以當前狀態顯示窗口但不改變當前激活的窗口
----SW_SHOWNOACTIVATE 以初始化大小顯示窗口但不改變當前激活的窗口
----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() :
不僅可以運行EXE文件,也可以運行系統已經關聯的文件。
這個函數和WIN9X中的命令行命令"start"類似,不光可以對文件進行操作,還可以對HTTP、MAILTO等進行操作。這樣我們可以設計有超級鏈接風格的程序了。
ShellExecute的功能要強得多,並且可以完全替代WinExec(),事實上,WinExec()也是為了和以前版本兼容而保留,所以,我們要盡量使用ShellExecute()。
首先必須引用shellapi.pas單元:uses ShellAPI;
函數原型:function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;
參數含義如下:
--hWnd:用於指定父窗口句柄。當函數調用過程出現錯誤時,它將作為Windows消息窗口的父窗口。例如,可以將其設置為應用程序主窗口句柄,即Application.Handle,也可以將其設置為桌面窗口句柄(用GetDesktopWindow函數獲得)。
--Operation:用於指定要進行的操作。
----open:操作表示執行由FileName參數指定的程序,或打開由FileName參數指定的文件或文件夾;
----print:操作表示打印由FileName參數指定的文件;
----explore:操作表示瀏覽由FileName參數指定的文件夾。
----為nil時,表示執行默認操作“open”。
--FileName:用於指定要打開的文件名、要執行的程序文件名或要瀏覽的文件夾名。
--Parameters:若FileName參數是一個可執行程序,則此參數指定命令行參數,否則此參數應為nil或PChar(0)。
--Directory:用於指定默認目錄。
--ShowCmd:若FileName參數是一個可執行程序,則此參數指定程序窗口的初始顯示方式,否則此參數應設置為0。
----SW_HIDE 隱藏
----SW_MAXIMIZE 最大化
----SW_MINIMIZE 最小化,並把Z order順序在此窗口之后(即窗口下一層)的窗口激活
----SW_RESTORE 激活窗口並還原為初始化大小 SW_SHOW 以當前大小和狀態激活窗口
----SW_SHOW 用當前的大小和位置顯示一個窗口,同時令其進入活動狀態
----SW_SHOWDEFAULT 以默認方式運行
----SW_SHOWMAXIMIZED 激活窗口並最大化
----SW_SHOWMINIMIZED 激活窗口並最小化
----SW_SHOWMINNOACTIVE 最小化但不改變當前激活的窗口
----SW_SHOWNA 以當前狀態顯示窗口但不改變當前激活的窗口
----SW_SHOWNOACTIVATE 以初始化大小顯示窗口但不改變當前激活的窗口
----SW_SHOWNORMAL 激活並顯示窗口,如果是最大(小)化,窗口將會還原。第一次運行程序 時應該使用這個值
若ShellExecute函數調用成功,則返回值為被執行程序的實例句柄。若返回值小於32,則表示出現錯誤。
示例:
(1),剛才的例子:WinExec(pChar('notepad c:\taoyoyo.txt'),SW_SHOWNORMAL);
就可以改變為(假設窗口的句柄為Handle)
ShellExecute(Handle,'open','notepad','c:\taoyoyo.txt','',SW_SHOWNORMAL);
此外,還可以不用那么復雜,因為.TXT的關聯程序就是記事本,所以只要這樣就可以了:
ShellExecute(Handle,'','c:\taoyoyo.txt','','',SW_SHOWNORMAL);
(2),例子(delphi):
在一個應用程序調用c:Project1.exe;
ShellExecute(handle, 'open','c:Project1.exe','字串內容',nil, SW_SHOWNORMAL);
在Project1.exe里可以調用:
procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
for i:=1 to paramcount do
if ParamStr(i)〈〉'' then showmessage(ParamStr(i));
end;
(3),在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:hugsnow@126.com
並把字體改為藍色有下划線,然后分別在兩個Label的Click事件中加入以下代碼:
ShellExecute(Me.hWnd,"",lbHomepage.Caption,"","",SW_SHOWNORMAL);
ShellExecute(Me.hWnd,"",lbEMail.Caption,"","",SW_SHOWNORMAL);
3,ShellExecute() 特殊用法
如果將FileName參數設置為“http:”協議格式,那么該函數將打開默認瀏覽器並鏈接到指定的URL地址。若用戶機器中安裝了多個瀏覽器,則該函數將根據Windows 9x/NT注冊表中http協議處理程序(Protocols Handler)的設置確定啟動哪個瀏覽器。
格式一:http://網站域名。
如:ShellExecute(handle, 'open', http:// ; www.neu.edu.cn', nil, nil, SW_SHOWNORMAL);
格式二:http://網站域名/網頁文件名。
如:ShellExecute(handle, 'open', http:// ; www.neu.edu.cn/default.htm',nil,nil, SW_SHOWNORMAL);
如果將FileName參數設置為“mailto:”協議格式,那么該函數將啟動默認郵件客戶程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用戶機器中安裝了多個郵件客戶程序,則該函數將根據Windows 9x/NT注冊表中mailto協議處理程序的設置確定啟動哪個郵件客戶程序。
格式一:mailto:
如:ShellExecute(handle,'open', 'mailto:', nil, nil, SW_SHOWNORMAL);打開新郵件窗口。
格式二:mailto:用戶賬號@郵件服務器地址
如:ShellExecute(handle, 'open',' mailto:who@mail.neu.edu.cn', nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址。若指定多個收件人地址,則收件人地址之間必須用分號或逗號分隔開(下同)。
格式三:mailto:用戶賬號@郵件服務器地址?subject=郵件主題&body=郵件正文
如:ShellExecute(handle, 'open', ' mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test', nil, nil, SW_SHOWNORMAL);打開新郵件窗口,並自動填入收件人地址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉義字符%0a。
===============
其它文章:
介紹一個功能強大的API函數 ShellExecute
編譯 趙湘寧
問題的提出:
我使用MFC編寫一個APP,要求About對話框中顯示LOGO、公司名、地址和公司的URL鏈接。使用戶點擊URL鏈接以后,啟動瀏覽器訪問Web頁面,這種對話框中的熱鏈接使應用程序增色不少。我琢磨的方法是從系統注冊表中通過查找.htm 或 .html文件的關聯程序來獲得缺省瀏覽器的名字,這樣好象有很多工作要做。此外,如果瀏覽器已經打開,總是開始一個新的實例替代當前已有的一個實例。想找一個容易一點的方法,但我查過有關的資料,沒有收獲,請高手指教。
解決方法:
如果有這樣的一個API函數該多好:OpenThisHereURLForMeNowPlease(),問題不就解決了!!我告訴你吧,有,但它不是你所想象的那個函數。到目前為止,有關文檔中還沒有提到過這么一個有用的函數,它能打開桌面上的任何文件,也能打開Internet URL。唯一我能找到的參考資料是在Microsoft® Access KnowledgeBase中很曖昧地提到過這個函數。
這個不可思議的函數就是:ShellExecute,取代了WinExec。你可以給它任何文件的名字,它都能識別出來並打開它。例如:
ShellExecute(NULL,"open","iloveu.bmp",NULL,NULL,SW_SHOWNORMAL);
用缺省的位圖編輯器打開一個叫iloveu.bmp的位圖文件,這個缺省的位圖編輯器可能是Microsoft Paint, Adobe Photoshop, 或者 Corel PhotoPaint。
有關ShellExecute的詳細用法信息自己去參考有關資料吧,重要的是你知道了這個函數能打開任何文件,甚至是桌面和URL快捷方式( .ink或 .url)。ShellExecute解析系統注冊表HKEY_CLASSES_ROOT中所有的內容,判斷啟動那一個執行程序,並且啟動一個新的實例或使用DDE將文件名連到一打開的實例。然后,ShellExecute 返回打開文件的應用的實例句柄。
更奇妙的是ShellExecute不僅能打開機器上的文件,還能打開Internet的站點地址。例如:
ShellExecute(NULL, "open", "http://www.microsoft.com", NULL, NULL, SW_SHOWNORMAL);
這個代碼使你能訪問微軟的主頁。當ShellExecute遇到文件名前面的“http:”時,可以判斷出要打開的文件是Web文件,隨之啟動Internet Explorer 或者 Netscape Navigator 或者任何你使用的別的瀏覽器打開文件。ShellExecute還能識別其它協議,象FTP、GOPHER。甚至識別“mailto”,如果文件名指向“mailto:zxn@hq.cninfo.net”,它啟動電子郵件程序並打開一個待編輯的新郵件。總之,ShellExecute函數就是如此簡單地打開磁盤文件和Internet文件。如果將第二個參數“OPEN”改為“PRINT”或者“EXPLORE”,ShellExecute將能打印文件和打開文件夾。ShellExecute還有一個擴展函數ShellExecuteEx,所帶參數中有一個特殊的結構,功能更強,它的用法參見有關文檔。
現在,你知道了ShellExecute的秘密,用它很容易增加一個鏈接到你的About對話框。不是嗎。
怎樣加載其他的應用程序?
三個SDK函數 winexec, shellexecute,createprocess可以使用。WinExec最簡單,兩個參數,前一個指定路徑,后一個指定顯示方式.后一個參數值得說一下,比如泥用 SW_SHOWMAXMIZED方式去加載一個無最大化按鈕的程序,就是Neterm,calc等等,就不會出現正常的窗體,但是已經被加到任務列表里了。
ShellExecute較 WinExex靈活一點,可以指定工作目錄,下面的Example就是直接打開 c:\temp\1.txt,而不用加載與 txt文件關聯的應用程序,很多安裝程序完成后都會打開一個窗口,來顯示Readme or Faq,我猜就是這么作的啦.
ShellExecute(NULL,NULL,_T("1.txt",NULL,_T("c:\\temp",SW_SHOWMAXMIZED)
CreateProcess最復雜,一共有十個參數,不過大部分都可以用NULL代替,它可以指定進程的安全屬性,繼承信息,類的優先級等等.來看個很簡單的Example:
STARTUPINFO stinfo
//啟動窗口的信息
PROCESSINFO procinfo //進程的信息
CreateProcess(NULL,_T("notepad.exe",NULL,NULL.FALSE,
NORMAL_PRIORITY_
CLASS,NULL,NULL, &stinfo,&procinfo)