在Delphi中调用EXE文件,最简单、最容易理解的方法。

我们常用的函数有两个,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 不是有效路径不会提示错误。

[例] winexec('command.com /c copy *.* c:\',SW_Normal);

[例] winexec('start abc.txt');

//加一下按钮,加一个对话框就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注册的外部文件

如果一个文件已经在Windows的注册表中注册了,那我们就可以通过以下方法运行他,首先要在uses部分加入: uses Shellapi; 接着定义一个过程

procedure  URLink(URL:PChar);    
begin    
   ShellExecute(0,  nil,  URL,  nil,  nil,  SW_NORMAL);    
end;  

在要调用的地方使用: URLink('Readme.txt');

要链接到主页就改用: URLink('http://vortex.yeah.net');

要发邮件就要在邮件地址前加: mailto URLink('mailto:guihong@163.net');

如果是打开外部执行程序的话,那么也可以直接调用。

---------------------------------------------------------------

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;