全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4761
推到 Plurk!
推到 Facebook!

shellExecute執行外部程式後如何讓原來的程式先暫停阿

答題得分者是:RedSnow
Egn
一般會員


發表:29
回覆:54
積分:16
註冊:2005-04-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-16 17:38:32 IP:220.138.xxx.xxx 未訂閱
我現在的問題就是用shellExecute執行一個外部程式後,我想等外部程式跑完再繼續跑下一行的程式請問要怎麼做阿...
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-16 18:13:53 IP:219.137.xxx.xxx 未訂閱
Egn 您好:    參考一下這兩篇 Delphi 的討論與範例:    http://delphi.ktop.com.tw/topic.php?topic_id=20984 http://delphi.ktop.com.tw/topic.php?topic_id=38858 或是以 SHellExcute 及 WaitForSingleObject 這兩個關鍵字搜尋站上文章,可以找到更多的參考資料。
Egn
一般會員


發表:29
回覆:54
積分:16
註冊:2005-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-16 18:58:51 IP:220.228.xxx.xxx 未訂閱
我試了這個方法不行ㄝ HANDLE hProg; hProg=ShellExecute(NULL, NULL, "rasphone.exe", NULL, NULL, SW_SHOW); WaitForSingleObject(hProg, INIFINTE); ... 結果還是沒有等就執行下一行了...我在想是不是因為我的rasphone.exe是一個對話視窗,第一個視窗出來後它就認為做完了..可是我是要等到最後一個步驟按下完成,對話試窗結束後才執行下一行ㄝ..
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-16 19:14:27 IP:219.137.xxx.xxx 未訂閱
以您的 case 來看可能還需要加上迴圈來處理,例如:
HANDLE hProg;
hProg=ShellExecute(NULL, NULL, "rasphone.exe", NULL, NULL, SW_SHOW);
WaitForSingleObject(hProg, INIFINTE);
while(WaitForSingleObject(hProg, 100) == WAIT_TIMEOUT){
    Application->ProcessMessages();
    if(Application->Terminated){
        break;
    }
}
....
但是這段碼我沒測試過,您先試試看吧。
Egn
一般會員


發表:29
回覆:54
積分:16
註冊:2005-04-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-16 19:19:52 IP:210.80.xxx.xxx 未訂閱
我試了一下,還是不行~~還是它認為第一個對話視窗出來就算是結束了阿...
Egn
一般會員


發表:29
回覆:54
積分:16
註冊:2005-04-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-16 19:22:14 IP:61.220.xxx.xxx 未訂閱
我在while迴圈李面設中斷點,發現它跟本沒跑進去...這是不是代表真的算已經結束了阿???
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-16 19:40:51 IP:219.137.xxx.xxx 未訂閱
Egn 您好:    我查了一下自己以前寫過的 Code,結果我是將 ShellExecute 改成始用下列方式完成,原因我不記得了,可能就是碰到過和您一樣的狀況吧?
AnsiString ExecPrg= "notepad.exe";
UINT Result;
DWORD dwExitCode;
STARTUPINFO StartupInfo = {0};
PROCESS_INFORMATION ProcessInfo;    StartupInfo.cb = sizeof(STARTUPINFO);
Result = CreateProcess(NULL, ExecPrg.c_str(), NULL, NULL, false, 0, NULL, NULL, &StartupInfo, &ProcessInfo);
if (Result) {
    CloseHandle(ProcessInfo.hThread);
    if (WaitForSingleObject(ProcessInfo.hProcess, INFINITE) != WAIT_FAILED) {
        GetExitCodeProcess(ProcessInfo.hProcess,&dwExitCode);
    }
/* 剛才測試時,前一段有做到等待的動作,這一段您自己考慮一下是否要使用?
    while (WaitForSingleObject(ProcessInfo.hProcess, 100) == WAIT_TIMEOUT) {
        Application->ProcessMessages();
        if (Application->Terminated) {
            GetExitCodeProcess(ProcessInfo.hProcess,&dwExitCode);
            break;
        }
    }
*/
    CloseHandle(ProcessInfo.hProcess);
}
您再試試看吧~ 發表人 - RedSnow 於 2005/05/16 19:47:12
Egn
一般會員


發表:29
回覆:54
積分:16
註冊:2005-04-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-16 19:47:11 IP:220.228.xxx.xxx 未訂閱
debug時發現return value不是WAIT_ABANDONED,WAIT_OBJECT_0,WAIT_TIMEOUT,是不是說跟本這個function對我的情形來說是不氏用的呢..因為msdn有說 If the function succeeds, the return value indicates the event that caused the function to return. This value can be one of the following. 而我的return值是一個數字字串,所以應該是沒用了吧~~~
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-16 19:54:58 IP:219.137.xxx.xxx 未訂閱
那些是預先定義的常數,所以傳回的是數字沒錯,您可以參考 winnt.h 與 winbase.h 內的宣告來比對那些數字到底是對應到那個常數?
winnt.h:
#define STATUS_WAIT_0                    ((DWORD   )0x00000000L)    
#define STATUS_ABANDONED_WAIT_0          ((DWORD   )0x00000080L)    
#define STATUS_USER_APC                  ((DWORD   )0x000000C0L)    
#define STATUS_TIMEOUT                   ((DWORD   )0x00000102L)        winbase.h:
#define WAIT_FAILED            (DWORD)0xFFFFFFFF
#define WAIT_OBJECT_0          ((STATUS_WAIT_0 )   0 )    #define WAIT_ABANDONED         ((STATUS_ABANDONED_WAIT_0 )   0 )
#define WAIT_ABANDONED_0       ((STATUS_ABANDONED_WAIT_0 )   0 )    #define WAIT_TIMEOUT           STATUS_TIMEOUT
#define WAIT_IO_COMPLETION     STATUS_USER_APC
剛才那一段程式碼在您測試後,有發揮等待的作用嗎? 發表人 - RedSnow 於 2005/05/16 20:00:12
Egn
一般會員


發表:29
回覆:54
積分:16
註冊:2005-04-14

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-16 19:58:58 IP:61.66.xxx.xxx 未訂閱
ok了,你最後貼的那個CreateProcess果然可以了...我剛剛也有看到說The WaitForSingleObject function can wait for the following objects: Change notification Console input Event Job Mutex Process Semaphore Thread Waitable timer 我就想說外部程式好像不包括在這幾項當中,然怪每次都是function failed...想說是不是要用process..果然RedSnow你實在太聰明了,多謝多謝你阿..謝謝你一直在線上幫我阿...多謝阿~~~
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-16 20:03:08 IP:219.137.xxx.xxx 未訂閱
呵呵~好說、好說,我今天腦子有點不太清醒,所以搞了不少烏龍事件,浪費了您的寶貴時間,我也感到很抱歉,知道您終於解決了問題,這也讓我呼了一口氣....。
Egn
一般會員


發表:29
回覆:54
積分:16
註冊:2005-04-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-05-16 20:18:00 IP:210.80.xxx.xxx 未訂閱
能不能問一個題外的話阿..我去看一下STARTUPINFO的用法...可是我看不出來為什麼你會STARTUPINFO StartupInfo = {0}; 等於0呢...這個與法我沒看過,剛剛看一下,可是我一定不會知道要怎麼設它,你們都是怎麼從msdn查出來說一個語法要怎麼設它的值阿...該不會是經驗吧..
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-05-16 21:27:37 IP:219.137.xxx.xxx 未訂閱
Egn 您好:    STARTUPINFO 是個結構資料,您說的那個動作只是將宣告該結構型態的 StartupInfo 每個結構項目都設為 0,也就是都賦予初值為 0,有些結構的用法其實我也會搞不清楚,如果我能找到合適的範例,可能就會先參考該範例來做設定,要不然就先空著不填,看看其後使用到該結構資料的地方,再接著查看那些處理動作的說明資料,看看那些項目需要填入何種資料?然後才對那些結構項目給值,其它的項目則一樣空著,再不行的話就只好動用經驗法則 - 用試的....。    您提到的這個結構,在 MSDN 中查看時,解說頁面的後段有提到一些參考資料 (See Also),其中就有寫到 CreateProcess 這個函式:    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/startupinfo_str.asp 當我在點選查看該函式的資料時,該頁面的後段又提供了一個 Creating Processes 範例的連結: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp 接著查看範例頁面時 (該範例也正是您本篇問題所需要的): http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/creating_processes.asp 裡邊就有寫到如下的敘述: STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); .... ZeroMemory 這個動作恰好就是我上邊提到的,將整個結構內的項目均賦予 0 為初值,這就是參考的依據囉,以上是個人的一點經驗,您參考一下吧。
Egn
一般會員


發表:29
回覆:54
積分:16
註冊:2005-04-14

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-05-18 20:06:01 IP:61.230.xxx.xxx 未訂閱
RedSnow大大又發生一個問題了,這個程式在Winme底下停不下來,我去看了一下,這些api都有支援到win95阿..為什麼winme停不下來呢..
系統時間:2024-05-03 12:11:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!