介绍5种比较常用的运行程序的方法,
包括WinExec、ShellExecute、CreateProcess、CreateProcessAsUser、CreateProcessWithLogonW
//以下为完整源代码
unit Unit1;
inte***ce
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,shellapi;
const
cmd='C:\WINDOWS\system32\cmd.exe';//要运行的程序
para='/?'; //参数
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
procedure Button3Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//CreateProcess运行程序
procedure TForm1.Button3Click(Sender: TObject);
var
StartUpInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
with StartupInfo do
begin
cb := SizeOf(TStartupInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOWNORMAL;
end;
CreateProcess(PChar(cmd), //程序名 pchar(para), //参数 nil,nil,False,
NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo);
end;
//WinExec运行程序
procedure TForm1.Button1Click(Sender: TObject);
begin
winexec(pchar(cmd+' '+para),SW_SHOWNORMAL); //命令行+参数
end;
//shellexecute运行程序,需要添加shellapi单元
procedure TForm1.Button2Click(Sender: TObject);
begin
shellexecute(handle,'open',pchar(cmd),//程序名 pchar(para), //参数 nil, //默认文件夹
SW_SHOWNORMAL);//正常显示
end;
//CreateProcessAsUser运行程序
procedure TForm1.Button4Click(Sender: TObject);
var
hToken:thandle;
ph:thandle;
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
begin
ph:=openprocess(PROCESS_ALL_ACCESS ,
false,
GetCurrentProcessID());
if ph<=0 then exit;
openprocesstoken( ph,TOKEN_ALL_ACCESS,hToken); //去当前进程Token等同于取当前帐户Token
try
ZeroMemory( @si, sizeof( STARTUPINFO ) );
si.cb := sizeof( STARTUPINFO );
Si.lpDesktop := PChar('Winsta0\Default');
si.wShowWindow:=SW_SHOWNORMAL;
CreateProcessAsUser(hToken,pchar(cmd) , //程序名pchar(para), //参数 nil,nil,FALSE,
CREATE_DEFAULT_ERROR_MODE,//NORMAL_PRIORITY_CLASS or CREATE_NEW_CONSOLE,
nil,nil,si,pi );
finally
closehandle(ph);
end;
end;
//以下为CreateProcessWithLogonW常量、结构、函数定义
const
LOGON_WITH_PROFILE = $00000001;
LOGON_NETCREDENTIALS_ONLY = $00000002;
LOGON_ZERO_PASSWORD_BUFFER = DWORD($80000000);
type
LPSTARTUPINFOW = ^STARTUPINFOW;
_STARTUPINFOW = record
cb: DWORD;
lpReserved: LPWSTR;
lpDesktop: LPWSTR;
lpTitle: LPWSTR;
dwX: DWORD;
dwY: DWORD;
dwXSize: DWORD;
dwYSize: DWORD;
dwXCountChars: DWORD;
dwYCountChars: DWORD;
dwFillAttribute: DWORD;
dwFlags: DWORD;
wShowWindow: WORD;
cbReserved2: WORD;
lpReserved2: ^Byte;
hStdInput: THANDLE;
hStdOutput: THANDLE;
hStdError: THANDLE;
end;
STARTUPINFOW = _STARTUPINFOW;
TStartupInfoW = STARTUPINFOW;
PStartupInfoW = LPSTARTUPINFOW;
function CreateProcessWithLogonW(lpUsername, lpDomain, lpPassword: LPCWSTR;
dwLogonFlags: DWORD;
lpApplicationName: LPCWSTR;
lpCommandLine: LPWSTR;
dwCreationFlags: DWORD;
lpEnvironment: pointer;
lpCurrentDirectory: LPCWSTR;
const lpStartupInfo: STARTUPINFOW;
var lpProcessInformation: PROCESS_INFORMATION): BOOL;
stdcall;external 'ADVAPI32.dll';
//结束定义
//CreateProcessWithLogonW运行程序
procedure TForm1.Button5Click(Sender: TObject);
var
si: StartupInfoW;
pif: PROCESS_INFORMATION;
spath:array[0..MAX_PATH] of widechar;
begin
if not fileexists(cmd) then exit;
stringtowidechar(cmd+' '+para,@spath,sizeof(spath));
si.cb := SizeOf(startupinfoW);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_SHOWDEFAULT;
si.lpReserved := nil;
si.lpDesktop := nil;
si.lpTitle := 'JJony';
CreateProcessWithLogonW('test', //用户名,必须是已存在的帐户
nil, //域名,不在域中为空
'123456', //密码,一定要和指定帐户对应哦
LOGON_WITH_PROFILE,
nil, //程序名
@spath, //命令行+' '+参数
CREATE_DEFAULT_ERROR_MODE,
nil,
nil,
si,
pif);
end;
end.