線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4771
推到 Plurk!
推到 Facebook!

如何判段 Shellexecute 執行完了沒?? 或讓程式等ShellExecute

 
yu168
一般會員


發表:29
回覆:27
積分:16
註冊:2002-06-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-03-22 14:45:35 IP:59.124.xxx.xxx 訂閱
我有一個Procedure 的流程是這樣的
1. 產生 excel 檔案
2. 把 excel 檔丟給 Winrar 進行壓縮(用 shellexecute 執行)
3.如果有壓縮檔則將該檔案用 Indy SMTP 寄出去, 否則寄出未壓縮的 excel檔

可是我發現, 如果不要壓縮, 則程序可以正常執行,
但是加入 shellexecute 進行壓縮時, 好像還沒壓縮完就開始寄信了, 造成程式卡住了,

有沒有辦法先檢查步驟2的狀態?? 如果步驟2正常結束的話再往下執行!!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-03-22 15:41:57 IP:210.241.xxx.xxx 訂閱
uses ShellAPI;
procedure TForm1.Button1Click(Sender: TObject);
var
  ShExecInfo : SHELLEXECUTEINFO;
  ProcessInfo : PROCESS_INFORMATION ;
  Startup_Info : STARTUPINFO ;
  Info: TShellExecuteInfo;
begin
  //SHELLEXECUTEINFO ShExecInfo = {0};
  //SHELLEXECUTEINFO ShExecInfo ;
  ShExecInfo.cbSize := sizeof(SHELLEXECUTEINFO);
  ShExecInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
  //ShExecInfo.hwnd := nil;
  ShExecInfo.Wnd :=Application.Handle; ;
  ShExecInfo.lpVerb := '';
  ShExecInfo.lpFile := 'C:\Windows\NotePad.exe';
  ShExecInfo.lpParameters := '';
  ShExecInfo.lpDirectory := nil;
  ShExecInfo.nShow := SW_SHOW;
  //ShExecInfo.hInstApp := nil;
  ShellExecuteEx(@ShExecInfo);
  WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
  // ShellExecuteEx 執行的程式關閉了, 才會繼續做下去
  ShowMessage('Success!');
end;
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
yu168
一般會員


發表:29
回覆:27
積分:16
註冊:2002-06-28

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-03-22 17:12:59 IP:220.130.xxx.xxx 訂閱
<textarea class="delphi" rows="10" cols="60" name="code"> var SEInfo: TShellExecuteInfo; ExitCode: DWORD; ExecuteFile, ParamString, StartInString: string; begin ExecuteFile := "C:\Winrar\winrar.exe"; ParamString := PChar(' A -r -ep -df ' AnsiQuotedStr(ARCLogFileName,'"') ' ' AnsiQuotedStr(SourceFilename, '"')); FillChar(SEInfo, SizeOf(SEInfo), 0) ; SEInfo.cbSize := SizeOf(TShellExecuteInfo) ; with SEInfo do begin fMask := SEE_MASK_NOCLOSEPROCESS; Wnd := Application.Handle; lpFile := PChar(ExecuteFile) ; lpDirectory := PChar(SysParam.WorkPath); lpParameters := PChar(ParamString); nShow := SW_SHOWNORMAL; end; if ShellExecuteEx(@SEInfo) then begin repeat Application.ProcessMessages; GetExitCodeProcess(SEInfo.hProcess, ExitCode) ; until (ExitCode <> STILL_ACTIVE) or Application.Terminated; end </textarea> 感謝您的相助! 剛剛找到Fishman之前的文章, 已經解決了! 我的程式碼如上給大家參考, 對照一下您的文章, 應該是一樣的做法!!
boson
中階會員


發表:74
回覆:155
積分:85
註冊:2004-07-31

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-03-23 07:25:59 IP:218.170.xxx.xxx 訂閱
我的做法是, 直接在程式中使用 ZipTV 元件進行壓縮, 不需要執行 WinRAR

系統時間:2024-04-20 15:51:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!