請教如何在Delphi中執行外部程式,並等它結束後才回到Delphi! |
缺席
|
SKYSTAR
中階會員 發表:76 回覆:198 積分:64 註冊:2002-06-10 發送簡訊給我 |
各位大大好: 請教一下, 我寫了一個專案, 其中一個Button是去執行外部程式, 此外部程式
是一支InstallShield的安裝程式..... 請問,我該如何做才可以達到下面的功能呢? (指過程)
(1) 啟動該外部程式 (即:安裝程式)
(2) 此時將專案給隱藏起來, 主要是不讓User亂動
(3) 安裝程式結束或是放棄時, 才將專案再次給顯示出來 我現在遇到的問題是: 我不知道該安裝程式何時會結束....
我也試著去用Application.ProcessMessages放在一個用FindWindows或用
EnumWindows的迴圈中.....這樣子做是可以達到我要的功能....可是這樣子
在執行安裝程式時,所花的時間比單獨執行該安裝程式要多了兩倍時間.... 請問...如何才能達到上面的功能且時間上不會相差太多呢? Thanks!!
|
terrychen
尊榮會員 發表:90 回覆:794 積分:501 註冊:2003-05-01 發送簡訊給我 |
您好:
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 發送簡訊給我 |
引言: 您好:您好: 看過您所留的連結及所貼的程式.....我試作後發現一個問題: 如果是一般的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!!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 發送簡訊給我 |
哈.... 終於讓我找到一個方式來達到我所要的功能了!!
在此也提供給各位朋友做個參考!! 比如說:
> 這其中的秘訣就是利用 >
下面是當 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秒) 提供給大家做參考囉!! 註: 我也是試了好多天才想到這個方式的....嗯...好累人!! 不過幸好解決了! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |