您的位置:首页 > 编程语言 > Delphi

delphi 啟動外部程式(收藏參考)

2009-01-07 12:54 603 查看
// 上傳檔案

IdFTP.Put(ALocalFileName, AServerFileName,False);

// 下載檔案

IdFTP.Get(AServerFileName, ALocalFileName,AUpdateMode,False);

// 檢查文件是否存在

try
IdFTP.List(Lv_LS,ALocalFileName);  
if Lv_LS.Text = '' then
Lv_File_Found := False
else
Lv_File_Found := True;
except
Lv_File_Found := False;
end;

Function TfrmNormalForm.Fork(AFileName,AFileType,AFileParam : string; AlpProcessInformation :PTProcessInformation ) :boolean ;
var
Update_SW : Boolean;
bCreateProcess: boolean;
lpStartupInfo: TStartupInfo;
WaitSts: Integer;
LocalFile,Lv_PurView,Tst_FileName : string;
Query1 : TQuery;
f : file of Byte;
size : Longint;
Lv_ExeName,Link_File : String;
begin
Result := False;
if DirectoryExists(Gc_FileHome) then
ChDir(Gc_FileHome);

Tst_FileName := 'T_' + AFilename;
LocalFile := Gc_FileHome+'/'+Tst_FileName+'.EXE';     // Gc_FileHome := 'C:/WALSIN'
Lv_ExeName :=  Tst_FileName;
Query1 := TQuery.Create(nil);
if not DBModule.DBSECURITY.Connected then
DBModule.DBSECURITY.Connected := True;

With Query1 do
begin
DataBaseName := DBModule.DBSECURITY.DatabaseName;
Close;
SQL.Text :=  ' SELECT GET_FUNC(:USERID,:PROGID) FUNC_CODE  '+
' FROM   DUAL    ';
ParamByName('USERID').AsString := G_USERID;
ParamByName('PROGID').AsString  := AFileName;
Open;
Lv_PurView := '';
if Not Eof then
begin
Lv_PurView := FieldByName('FUNC_CODE').AsString;
end
else
begin
ShowMessage('無權執行');
Abort;
end;
Close;
SQL.Text := ' Select LINK_PROGID '+
' FROM SYS001M  '+
' Where PROGID = :PROGID ';
ParamByName('PROGID').AsString  := AFilename;
Open;
if  not Eof then
begin
if  FieldByName('LINK_PROGID').AsString <> '' then
begin
Link_File := FieldByName('LINK_PROGID').AsString;
Lv_ExeName := StringReplace(Lv_ExeName,AFilename,Link_File,[]);
end;
end;

Close;
SQL.Text := ' Select UPLOAD_DATE,FILE_SIZE '+
' FROM SYS006M  '+
' Where PROGID = :PROGID ';
ParamByName('PROGID').AsString  := Lv_ExeName;
Open;

if  not Eof then
begin
Update_SW := False;
if Not FileExists(LocalFile) then
Update_SW := True
else
begin
Try
if StrComp(PChar(FormatDateTime('yyyy/mm/dd hh:mm:ss',FieldByName('UPLOAD_DATE').AsDateTime)),
PChar(FormatDateTime('yyyy/mm/dd hh:mm:ss',FileDateToDateTime(FileAge(LocalFile)))) ) > 0  then
Update_SW := True
else
begin
try
AssignFile(f, LocalFile);
FileMode := 0;  {Set file access to read only }
Reset(f);
size := FileSize(f);
CloseFile(f);
if ( FieldByName('FILE_SIZE').AsInteger <> size ) then
Update_SW := True;
except
Update_SW := False;   //表示已在執行
end;
end;

Except
Update_SW := False;   //表示已在執行
end;
end;

if Update_SW then
begin
Try
StatusBar.Panels[0].Text := '更新最新版程式:' + Tst_FileName  +' 中..';
StatusBar.Refresh;
IdFTP.UserName := Uv_TestUser;
IdFTP.Password := Uv_TestPassword;
IdFTP.Host := Uv_TestFileServer;

IdFTP.Connect;
if IdFTP.Connected then
begin
if Uv_TestFileDir <> '' then
IdFTP.ChangeDir(Uv_TestFileDir);
IdFTP.Get(Lv_ExeName+'.EXE', Tst_FileName+'.EXE',True,False);
IdFTP.Disconnect;
StatusBar.Panels[0].Text := '已更新完成最新版程式:' + Tst_FileName +'.';
StatusBar.Refresh;
try
begin
if not DBModule.DBSECURITY.InTransaction then
DBModule.DBSECURITY.StartTransaction;

Close;
SQL.Text := ' Insert Into SYS006D1 (HOSTNAME,PROGID,UPDATE_DATE,VERSION) '+
' SELECT :HOSTNAME,:PROGID,SYSDATE,VERSION  '+
' FROM SYS006M '+
' WHERE PROGID = :PROGID ';
ParamByName('HOSTNAME').AsString  := Uv_HostName;
ParamByName('PROGID').AsString := Lv_ExeName;
ExecSQL;
end;
if DBModule.DBSECURITY.InTransaction then
DBModule.DBSECURITY.Commit;
except
if DBModule.DBSECURITY.InTransaction then
DBModule.DBSECURITY.Rollback;
end;

end;
Except
StatusBar.Panels[0].Text := '無法與服務器 '+Uv_TestFileServer+'連線';
ShowMessage(StatusBar.Panels[0].Text+ ',無法更新程式');
IdFTP.Disconnect;
end;
end;
FillChar(lpStartupInfo, Sizeof(TStartupInfo), #0);
lpStartupInfo.cb := Sizeof(TStartupInfo);
lpStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
lpStartupInfo.wShowWindow := SW_SHOWNORMAL;
bCreateProcess := CreateProcess(nil, PChar(LocalFile +' '+                        // LocalFile := 'C:/WALSIN/XXX.EXE'
'XXX' +' '+
'XXX' + ' '+
G_USERID +' '+
G_USERPASSWORD +' '+
Lv_PurView + ' '+
AFileParam),
nil, nil, False, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil, nil, lpStartupInfo, AlpProcessInformation^);
Result := bCreateProcess;
end;
Close;
end;
Query1.free;
if DBModule.DBSECURITY.Connected then
DBModule.DBSECURITY.Connected := False;
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: