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

請教如何在Delphi中執行外部程式,並等它結束後才回到Delphi!

缺席
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-02-13 12:17:50 IP:203.73.xxx.xxx 未訂閱
各位大大好: 請教一下, 我寫了一個專案, 其中一個Button是去執行外部程式, 此外部程式 是一支InstallShield的安裝程式..... 請問,我該如何做才可以達到下面的功能呢? (指過程) (1) 啟動該外部程式 (即:安裝程式) (2) 此時將專案給隱藏起來, 主要是不讓User亂動 (3) 安裝程式結束或是放棄時, 才將專案再次給顯示出來 我現在遇到的問題是: 我不知道該安裝程式何時會結束.... 我也試著去用Application.ProcessMessages放在一個用FindWindows或用 EnumWindows的迴圈中.....這樣子做是可以達到我要的功能....可是這樣子 在執行安裝程式時,所花的時間比單獨執行該安裝程式要多了兩倍時間.... 請問...如何才能達到上面的功能且時間上不會相差太多呢? Thanks!!
terrychen
尊榮會員


發表:90
回覆:794
積分:501
註冊:2003-05-01

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-02-13 12:36:05 IP:211.22.xxx.xxx 未訂閱
您好:  
 
      TStartupInfo  StartupInfo;      TProcessInformation  ProcessInformation;           StartupInfo.cb=sizeof(TStartupInfo);      StartupInfo.dwFlags=STARTF_USESHOWWINDOW;      StartupInfo.wShowWindow=SW_NORMAL;      if(CreateProcess(NULL, "Rundll32.exe C:\\PROGRA~1\\COMMON~1\\SYSTEM\\OLEDB~1\\OLEDB32.DLL,OpenDSLFile d:\\ConnectionSQL.UDL ",NULL, NULL, true, NORMAL_PRIORITY_CLASS, NULL, NULL,&StartupInfo, &ProcessInformation))         WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
參考http://delphi.ktop.com.tw/topic.php?topic_Id=21297 ~~應無所住而生其心~~ 發表人 - Terrychen 於 2004/02/13 12:39:54
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-02-13 17:17:56 IP:203.73.xxx.xxx 未訂閱
引言: 您好:
 
      TStartupInfo  StartupInfo;      TProcessInformation  ProcessInformation;           StartupInfo.cb=sizeof(TStartupInfo);      StartupInfo.dwFlags=STARTF_USESHOWWINDOW;      StartupInfo.wShowWindow=SW_NORMAL;      if(CreateProcess(NULL, "Rundll32.exe C:\\PROGRA~1\\COMMON~1\\SYSTEM\\OLEDB~1\\OLEDB32.DLL,OpenDSLFile d:\\ConnectionSQL.UDL ",NULL, NULL, true, NORMAL_PRIORITY_CLASS, NULL, NULL,&StartupInfo, &ProcessInformation))         WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
參考http://delphi.ktop.com.tw/topic.php?topic_Id=21297 ~~應無所住而生其心~~ 發表人 - Terrychen 於 2004/02/13 12:39:54
您好: 看過您所留的連結及所貼的程式.....我試作後發現一個問題: 如果是一般的EXE檔,則可以在叫出該EXE檔後,然後等USER操作完該EXE檔並結 束該EXE時,這時才會將操作權返回到自己的專案EXE中....這個是正常的!! (請注意,是USER自行將該叫出的EXE檔給關閉...而不是由專案EXE叫出該EXE並 執行後自動關閉的) 可是我現在遇到的問題是.... 由專案EXE去叫出的EXE檔,是由InstallShield所打包的Setup.exe....因此在實 作的情形就變成了.... (1)由專案EXE去叫出Setup.exe來執行 (2)等了好久....Setup也不會執行!! 整個專案EXE就好像死當了!! 我想這是因 為使用了WaitforSingleObject(....,INFINITE)的關係! (3)接著將專案給結束後,.....這時Setup.exe才開始執行!! 以上三點,如果是換作一般的EXE檔,就不會發生問題了!! 因此...我想要的結果就是....可以由專案中去執行Setup.exe,並等到Setup執 行完後,將控制權返回到專案中,然後來控管接下來的動作!! 能做得到嗎? Thanks!!
SKYSTAR
中階會員


發表:76
回覆:198
積分:64
註冊:2002-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-02-13 18:25:45 IP:203.73.xxx.xxx 未訂閱
哈....    終於讓我找到一個方式來達到我所要的功能了!!   在此也提供給各位朋友做個參考!! 比如說: > 這其中的秘訣就是利用 > 下面是當 class="code"> if FindWindow(nil, 'Setup') <> 0 then begin Timer1.Enabled := False; Form1.Hide; Form1.Update; Timer2.Enabled := True; end; (4)Timer2程序如下:
  if FindWindow(nil, '安裝程式') <> 0 then
  begin
    Timer2.Enabled := False;
    Timer3.Enabled := True;
  end;
(5)Timer3程序如下:
  if FindWindow(nil, '安裝程式') = 0 then
  begin
    Timer3.Enabled := False;
    Form1.Show;
    Form1.Update;
    // 將上面的Showmessage(....)移到這裡來做處理,也就是說當外部程式結
    // 束後想要處理的所有程式放在這裡即可!!
    // ............
    // ............
  end;
以上的方式就可以解決在論壇中一直讓大家頭疼的問題囉! (而且又不會因為使 用了Timer而讓整個專案或執行外部程式時而發生Delay的現象喲! 因為時間值 設定並不長...只有0.1秒) 提供給大家做參考囉!! 註: 我也是試了好多天才想到這個方式的....嗯...好累人!! 不過幸好解決了!
系統時間:2024-05-15 21:17:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!