如何判斷外部程序是否已經執行成功﹒(高手請進) (100分)

  • 主题发起人 主题发起人 atkins
  • 开始时间 开始时间
A

atkins

Unregistered / Unconfirmed
GUEST, unregistred user!
各位高手﹐以下程式是我在對一個Access資料庫做壓縮的程序﹐但不能執行﹒
我想應是壓縮動作太慢﹐在沒有執行完之前不可對其進行更名各刪除動作﹒我想
問大家有沒有什么方法判斷壓縮動作是否執行成功﹒然后再進以后續的動作﹒

procedure TFMmain.BitBtn8Click(Sender: TObject);
var
dao: OLEVariant;
begin
dao := CreateOleObject('DAO.DBEngine.36');
dao.CompactDatabase('J:/數據同步/MRPII/MRPII.mdb','J:/數據同步/MRPII/MRPII1.mdb');
DeleteFile('J:/數據同步/MRPII/MRPII.mdb');
RenameFile('J:/數據同步/MRPII/MRPII.mdb1','J:/數據同步/MRPII/MRPII.mdb');
winexec(pchar('C:/Program Files/WinRAR/WinRAR.exe a -m5 -y J:/數據同步/MRPII.rar J:/數據同步/MRPII/MRPII.mdb'),sw_show);
end;
 
winexec()>32
 
提前

关注!
 
TO:yanlei
問題是我想在
dao.CompactDatabase('J:/數據同步/MRPII/MRPII.mdb','J:/數據同步/MRPII/MRPII1.mdb');
成功執行后﹐再執行文件刪除和更名的動作﹒你的方法好像行不通﹒
TO﹕ ALL
能不能說的具体一些或有
其他方法﹐TKS﹒
 
Sorry,程式打錯了﹒再貼一次﹒
procedure TFMmain.BitBtn8Click(Sender: TObject);
var
dao: OLEVariant;
begin
dao := CreateOleObject('DAO.DBEngine.36');
dao.CompactDatabase('J:/數據同步/MRPII/MRPII.mdb','J:/數據同步/MRPII/MRPII1.mdb');
DeleteFile('J:/數據同步/MRPII/MRPII.mdb');
RenameFile('J:/數據同步/MRPII/MRPII1.mdb','J:/數據同步/MRPII/MRPII.mdb');
winexec(pchar('C:/Program Files/WinRAR/WinRAR.exe a -m5 -y J:/數據同步/MRPII.rar J:/數據同步/MRPII/MRPII.mdb'),sw_show);
end;
 
可以这样试试:
while true do
begin
try
DeleteFile('J:/數據同步/MRPII/MRPII.mdb');
break;
except
application.processmessages;
end;
end;
 
因為我把
RenameFile('J:/數據同步/MRPII/MRPII1.mdb','J:/數據同步/MRPII/MRPII.mdb');
誤輸為
RenameFile('J:/數據同步/MRPII/MRPII.mdb1','J:/數據同步/MRPII/MRPII.mdb');
其實以上的程序都沒什么問﹐但現再的新問題是﹕
看程序
if winexec(pchar('DTSRUN /S '+trim(ServerName.Text)+' /U sa /P 456 /N "'+trim(PackName.Text)+'"'+' /L '+lgfile),sw_show)>32 then
begin
dao.CompactDatabase('J:/數據同步/MRPII/MRPII.mdb','J:/數據同步/MRPII/MRPII1.mdb');
DeleteFile('J:/數據同步/MRPII/MRPII.mdb');
RenameFile('J:/數據同步/MRPII/MRPII1.mdb','J:/數據同步/MRPII/MRPII.mdb');
winexec(pchar('C:/Program Files/WinRAR/WinRAR.exe a -m5 -y J:/數據同步/MRPII.rar J:/數據同步/MRPII/MRPII.mdb'),sw_show);
end;
其中第一行表示執行MS SQL 的封裝﹐但是我如何判斷此封裝已經完成﹐并在其后執行
begin
.....
end
 
试改用:
bCreateProcess := CreateProcess(nil, PChar(runstr),
nil, nil, True, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil, nil, lpStartupInfo, lpProcessInformation);
if bCreateProcess then
WaitForSingleObject(lpProcessInformation.hProcess, INFINITE);
 
TO: ka_lee
你的方法我試過了,但還是有問題,我是這樣寫的不知行不行
********************************************************
var
dao: OLEVariant;

lgfile: string;
yy,mm,dd: word;
bCreateProcess: boolean;
runstr: string;

StartUpInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
begin
decodedate(now,yy,mm,dd);

try
if not DirectoryExists(ExtractFilePath(Application.EXEName)+'/LOG') then
mkdir(ExtractFilePath(Application.EXEName)+'/LOG/');
except
end;

lgfile:=ExtractFilePath(Application.EXEName)+'/LOG/'+inttostr(yy)+copy('0'+inttostr(mm),length('0'+inttostr(mm))-1,2)+copy('0'+inttostr(dd),length('0'+inttostr(dd))-1,2)+'.txt';
dao := CreateOleObject('DAO.DBEngine.36');
if RBT1.Checked then
begin
// winexec(pchar('DTSRUN /S '+trim(ServerName.Text)+' /U sa /P 456 /N "'+trim(PackName.Text)+'"'+' /L '+lgfile),sw_show);
//***
runstr:='DTSRUN /S '+chr(39)+trim(ServerName.Text)+' /U sa /P 456 /N "'+trim(PackName.Text)+'"'+' /L '+lgfile;
bCreateProcess :=CreateProcess(nil, PChar(runstr),nil,nil,True,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,StartupInfo,ProcessInfo);
if bCreateProcess then WaitForSingleObject(ProcessInfo.hProcess, INFINITE) end;
//--以下程式無問題我已測試過了
dao.CompactDatabase('J:/數據同步/MRPII/MRPII.mdb','J:/數據同步/MRPII/MRPII1.mdb');
DeleteFile('J:/數據同步/MRPII/MRPII.mdb');
RenameFile('J:/數據同步/MRPII/MRPII1.mdb','J:/數據同步/MRPII/MRPII.mdb');
winexec(pchar('C:/Program Files/WinRAR/WinRAR.exe a -m5 -y J:/數據同步/MRPII.rar J:/數據同步/MRPII/MRPII.mdb'),sw_show);
end;
************************************************************************************
 
多人接受答案了。
 
后退
顶部