我们常用的函数有两个,WinExec 和 ShellExecute。
1) 使用 WinExec 函数 (属于 WinProcs单元)
· 声明形式 UNIT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);
[例]
var SDir:string; SetLength(SDir,144); GetWindowsDirectory(PChar(SDir),144); SetLength(SDir,StrLen(PChar(SDir))); SDir:=SDir+'\notepad.exe'+' '+savedialog1.FileName; WinExec(PChar(SDir), SW_SHOWMAXIMIZED);注意:如果 SDir 不是有效路径不会提示错误。
//加一下按钮,加一个对话框就OK啦 procedure TForm1.Button1Click(Sender: TObject); var S: String; begin if OpenDialog1.Execute then begin s := OpenDialog1.FileName; WinExec( PChar(s), SW_NORMAL); end; end;---------------------------------------------------------------
2)使用 ShellExecute 函数(属于ShellAPI单元)
它的几个参数:
· hwnd:窗体的句柄;
· lpOperation:打开程序执行的操作,共预留有"open"、"explore"、 "print"三种方式,此参数可以省略,此时将依据打开的文件(lpFile)的类型执行相应的操作,比如:如果lpFile为一文本文件,那么将会在与该文件相关联的程序中打开它
· lpFile:文件名;
· lpParamerters:打开文件时所需的参数;
· lpDirectory:文件名所在的路径,当然,一般来说,在Windows中登记过的程序(如WinWord)不必提供此参数;
· nShowCmd:打开文件后程序窗体如何显示。
(1)运行可执行文件
[例] 以"记事本"为例
procedure TForm1.OpenBtnClick(Sender:TObject); begin
ShellExecute(handle,'open','notepad.exe',nil,nil,SW_ShowNormal); end;(2)此外,ShellExeCute() 还可以进行链接网络。
procedure TForm1.HttpClick(Sender: TObject); begin ShellExecute(handle,'open','http://liangming.163.net', nil,nil,SW_ShowNormal); end;(3)打开在Windows注册的外部文件
procedure URLink(URL:PChar); begin ShellExecute(0, nil, URL, nil, nil, SW_NORMAL); end;
function RunProgram(ProgramName:string;Wait:Boolean=False):Cardinal; var StartInfo:STARTUPINFO; ProcessInfo:PROCESS_INFORMATION; begin //执行外部程序,失败返回0,成功返回进程句柄 Result:=0; if ProgramName='' then exit; GetStartupInfo(StartInfo); StartInfo.dwFlags:=StartInfo.dwFlags or STARTF_FORCEONFEEDBACK; if not CreateProcess(nil,PChar(ProgramName),nil,nil,false,0, nil,nil,StartInfo,ProcessInfo) then exit; Result:=ProcessInfo.hProcess; //建立进程成功 //如果异步执行则退出 if not wait then exit; while IsProgram_Runing(Result) do Application.ProcessMessages; end; function IsProgram_Runing(hProcess:Cardinal):Boolean; var ExitCode:Cardinal; begin //查看进程是否正在运行 GetExitCodeProcess(hProcess,ExitCode); if ExitCode=STILL_ACTIVE then Result:=True else Result:=False; end;