shellExecute執行外部程式後如何讓原來的程式先暫停阿 |
答題得分者是:RedSnow
|
Egn
一般會員 發表:29 回覆:54 積分:16 註冊:2005-04-14 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
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 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
以您的 case 來看可能還需要加上迴圈來處理,例如:
HANDLE hProg; hProg=ShellExecute(NULL, NULL, "rasphone.exe", NULL, NULL, SW_SHOW);但是這段碼我沒測試過,您先試試看吧。 |
Egn
一般會員 發表:29 回覆:54 積分:16 註冊:2005-04-14 發送簡訊給我 |
|
Egn
一般會員 發表:29 回覆:54 積分:16 註冊:2005-04-14 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
那些是預先定義的常數,所以傳回的是數字沒錯,您可以參考 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 發送簡訊給我 |
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 發送簡訊給我 |
|
Egn
一般會員 發表:29 回覆:54 積分:16 註冊:2005-04-14 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |