Delphi调用外部程序的集中方法
Delphi調(diào)用外部程序
WinExec主要運行EXE文件。如:WinExec(’Notepad.exe Readme.txt’, SW_SHOW);
WinExec(
??lpCmdLine: LPCSTR; {文件名和參數(shù); 如沒指定路徑會按以下順序查找: 程序目錄/當(dāng)前目錄/System32/Windows/PATH環(huán)境變量}
??uCmdShow: UINT???? {啟動選項}
): UINT;
//返回值:
大于 31????????????????????{調(diào)用成功}
等于 0???????????????????? {內(nèi)存不足}
ERROR_FILE_NOT_FOUND = 2;??{文件名錯誤}
ERROR_PATH_NOT_FOUND = 3;??{路徑名錯誤}
ERROR_BAD_FORMAT???? = 11; {EXE 文件無效}
//uCmdShow 參數(shù)可選值:
SW_HIDE????????????= 0; {隱藏, 并且任務(wù)欄也沒有最小化圖標(biāo)}
SW_SHOWNORMAL??????= 1; {用最近的大小和位置顯示, 激活}
SW_NORMAL??????????= 1; {同 SW_SHOWNORMAL}
SW_SHOWMINIMIZED?? = 2; {最小化, 激活}
SW_SHOWMAXIMIZED?? = 3; {最大化, 激活}
SW_MAXIMIZE????????= 3; {同 SW_SHOWMAXIMIZED}
SW_SHOWNOACTIVATE??= 4; {用最近的大小和位置顯示, 不激活}
SW_SHOW????????????= 5; {同 SW_SHOWNORMAL}
SW_MINIMIZE????????= 6; {最小化, 不激活}
SW_SHOWMINNOACTIVE = 7; {同 SW_MINIMIZE}
SW_SHOWNA??????????= 8; {同 SW_SHOWNOACTIVATE}
SW_RESTORE???????? = 9; {同 SW_SHOWNORMAL}
SW_SHOWDEFAULT???? = 10; {同 SW_SHOWNORMAL}
SW_MAX???????????? = 10; {同 SW_SHOWNORMAL}
ShellExecute不僅可以運行EXE文件,也可以運行已經(jīng)關(guān)聯(lián)的文件。
首先必須引用shellapi.pas單元:uses ShellAPI;?
1.標(biāo)準(zhǔn)用法?
  ShellExecute函數(shù)原型及參數(shù)含義如下:?
  function ShellExecute(hWnd: HWND; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): HINST; stdcall;?
  ●hWnd:用于指定父窗口句柄。當(dāng)函數(shù)調(diào)用過程出現(xiàn)錯誤時,它將作為Windows消息窗口的父窗口。例如,可以將其設(shè)置為應(yīng)用程序主窗口句柄,即 Application.Handle,也可以將其設(shè)置為桌面窗口句柄(用GetDesktopWindow函數(shù)獲得)。?
  ●Operation:用于指定要進行的操作。其中“open”操作表示執(zhí)行由FileName參數(shù)指定的程序,或打開由FileName參數(shù)指定的文件或文件夾;“print”操作表示打印由FileName參數(shù)指定的文件;“explore”操作表示瀏覽由FileName參數(shù)指定的文件夾。當(dāng)參數(shù)設(shè)為nil時,表示執(zhí)行默認操作“open”。?
  ●FileName:用于指定要打開的文件名、要執(zhí)行的程序文件名或要瀏覽的文件夾名。?
  ●Parameters:若FileName參數(shù)是一個可執(zhí)行程序,則此參數(shù)指定命令行參數(shù),否則此參數(shù)應(yīng)為nil或PChar(0)。?
  ●Directory:用于指定默認目錄。?
  ●ShowCmd:若FileName參數(shù)是一個可執(zhí)行程序,則此參數(shù)指定程序窗口的初始顯示方式,否則此參數(shù)應(yīng)設(shè)置為0。
  若ShellExecute函數(shù)調(diào)用成功,則返回值為被執(zhí)行程序的實例句柄。若返回值小于32,則表示出現(xiàn)錯誤。?
  上述僅僅是ShellExecute函數(shù)的標(biāo)準(zhǔn)用法,下面將介紹它的特殊用法。?
2.特殊用法?
  如果將FileName參數(shù)設(shè)置為“http:”協(xié)議格式,那么該函數(shù)將打開默認瀏覽器并鏈接到指定的URL地址。若用戶機器中安裝了多個瀏覽器,則該函數(shù)將根據(jù)Windows 9x/NT注冊表中http協(xié)議處理程序(Protocols Handler)的設(shè)置確定啟動哪個瀏覽器。?
  格式一:http://網(wǎng)站域名。?
  如:ShellExecute(handle, ‘open’,?http://?;??http://www.neu.edu.cn/’/, nil, nil, SW_SHOWNORMAL);?
  格式二:http://網(wǎng)站域名/網(wǎng)頁文件名。?
  如:ShellExecute(handle, ‘open’,?http://;??www.neu.edu.cn/default.htm’,nil,nil,??SW_SHOWNORMAL);?
  如果將FileName參數(shù)設(shè)置為“mailto:”協(xié)議格式,那么該函數(shù)將啟動默認郵件客戶程序,如Microsoft Outlook(也包括Microsoft Outlook Express)或Netscape Messanger。若用戶機器中安裝了多個郵件客戶程序,則該函數(shù)將根據(jù)Windows 9x/NT注冊表中mailto協(xié)議處理程序的設(shè)置確定啟動哪個郵件客戶程序。?
  格式一:mailto:?
  如:ShellExecute(handle,‘open’, ‘mailto:’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口。?
  格式二:mailto:用戶賬號@郵件服務(wù)器地址?
  如:ShellExecute(handle, ‘open’,‘ mailto:who@mail.neu.edu.cn’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,并自動填入收件人地址。若指定多個收件人地址,則收件人地址之間必須用分號或逗號分隔開(下同)。?
  格式三:mailto:用戶賬號@郵件服務(wù)器地址?subject=郵件主題&body=郵件正文?
  如:ShellExecute(handle, ‘open’, ‘ mailto:who@mail.neu.edu.cn?subject=Hello&Body=This is a test’, nil, nil, SW_SHOWNORMAL);打開新郵件窗口,并自動填入收件人地址、郵件主題和郵件正文。若郵件正文包括多行文本,則必須在每行文本之間加入換行轉(zhuǎn)義字符%0a。?
例子(delphi):?
在一個應(yīng)用程序調(diào)用c:Project1.exe;?
ShellExecute(handle, ’open’,’c:Project1.exe’,’字串內(nèi)容’,nil, SW_SHOWNORMAL);?
在Project1.exe里可以調(diào)用:?
procedure TForm1.FormCreate(Sender: TObject);?
var i:integer;?
begin?
for i:=1 to paramcount do?
if ParamStr(i)〈〉’’ then showmessage(ParamStr(i));?
end;
最后的那個參數(shù),為窗口指定可視性方面的一個命令。?
請用下述任何一個常數(shù)?
SW_HIDE 隱藏窗口,活動狀態(tài)給令一個窗口?
SW_MINIMIZE 最小化窗口,活動狀態(tài)給令一個窗口?
SW_RESTORE 用原來的大小和位置顯示一個窗口,同時令其進入活動狀態(tài)?
SW_SHOW 用當(dāng)前的大小和位置顯示一個窗口,同時令其進入活動狀態(tài)?
SW_SHOWMAXIMIZED 最大化窗口,并將其激活?
SW_SHOWMINIMIZED 最小化窗口,并將其激活?
SW_SHOWMINNOACTIVE 最小化一個窗口,同時不改變活動窗口?
SW_SHOWNA 用當(dāng)前的大小和位置顯示一個窗口,不改變活動窗口?
SW_SHOWNOACTIVATE 用最近的大小和位置顯示一個窗口,同時不改變活動窗口?
SW_SHOWNORMAL 與SW_RESTORE相同?
?function ? ShellExecuteEx(lpExecInfo: ? PShellExecuteInfo):BOOL; ? stdcall; ??
?//使用一個結(jié)構(gòu)傳遞參數(shù),可以得到被調(diào)用者的進程句柄,可以用WaitForSingleObject(lpExecInfo^.hProcess,INFINITE)來等待它結(jié)束
?如果要得到被運行的程序的進程句柄,以便于等待它結(jié)束再繼續(xù)執(zhí)行,就要用ShellExecuteEx,CreateProcess和CreateProcessAsUser。
轉(zhuǎn)載于:https://www.cnblogs.com/phzend/p/5558787.html
總結(jié)
以上是生活随笔為你收集整理的Delphi调用外部程序的集中方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: iOS设备鲜有人知的“小功能”:为联系人
- 下一篇: 关于丑数
