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

如何取得外部程式的回傳值?

答題得分者是:RedSnow
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-07 15:09:58 IP:59.105.xxx.xxx 未訂閱
請教各位: 假設我有兩隻 console mode 的程式,A 跟 B 現在我用 BCB 寫了一隻程式要來呼叫 A 跟 B A 要執行完畢之後才能執行 B. 目前我是用 ShellExec 去呼叫 A 跟 B, 那我要怎麼得到程式的回傳值呢? (例如:回傳 0 代表正常結束, 回傳 -1 代表不正常結束) 我想藉此得知 A 是否正常執行完畢,是的話再執行 B. 或是有什麼辦法知道 A 已經執行完畢了,以便知道何時可以執行 B 呢? 目前我只想到用 Sleep() 來做個緩衝。 -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-07 16:20:22 IP:61.70.xxx.xxx 未訂閱
您好: 下面這篇您參考參考. http://delphi.ktop.com.tw/topic.php?topic_id=29856
RedSnow
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-07 17:36:51 IP:219.137.xxx.xxx 未訂閱
chtai 您好:    給您一個 CreateProcess() 與 ShellExecute() 混合使用的範例,請參考一下:
AnsiString ExecPrg = "A.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);
    }
    CloseHandle(ProcessInfo.hProcess);        ShellExecute(this->Handle, "open", "B.exe",NULL, NULL,SW_NORMAL);
}
範例執行後,會先執行 A.exe 程式,待 A.exe 關閉後,才會再接著執行 B.exe 程式,試試看吧。
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-07 20:35:10 IP:203.67.xxx.xxx 未訂閱
感謝兩位的回應,可是我還是不知怎樣得到程式的回傳值哩~ 或許是我之前說得不夠清楚吧~ 舉個例子好了,大多數的 console mode 程式都會寫得像這樣:    
 
int main()
{
    if (非預期結果)
        return -1;
    ..................        return 0;
}
我想請問的是,我要怎麼知道它是 return -1 還是 return 0 呢? -- http://www.csie.nctu.edu.tw/~chtai/software.php 好用免費軟體的收集網頁
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
RedSnow
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-07 21:19:23 IP:219.135.xxx.xxx 未訂閱
chtai 您好:    我寫的範例中,已經有取得返回值的動作了,下列這一行裡的 dwExitCode 就是接收 A.exe 程式結束後返回值的變數:
GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
如果您要依據程式結束後的返回值來做後續處理,那麼就直接用 dwExitCode 值來做判斷即可,您將前一篇的範例稍作修改即可達到您要的動作,例如:
AnsiString ExecPrg = "A.exe";
UINT Result;
DWORD dwExitCode = -1;  // 改成先給預設值
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);
    }
    CloseHandle(ProcessInfo.hProcess);        if(dwExitCode == 0){
        ShellExecute(this->Handle, "open", "B.exe",NULL, NULL,SW_NORMAL);
    }
}
發表人 - RedSnow 於 2005/06/07 21:31:56
chtai
高階會員


發表:68
回覆:238
積分:116
註冊:2004-05-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-07 21:31:38 IP:203.67.xxx.xxx 未訂閱
引言: chtai 您好: 我寫的範例中,已經有取得返回值的動作了,下列這一行裡的 dwExitCode 就是接收 A.exe 程式結束後返回值的變數:
GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
如果您要依據程式結束後的返回值來做後續處理,那麼就直接用 dwExitCode 值來做判斷即可
真是抱歉, 是我自己不好,沒注意到 問題已經解決,感謝
------
My Web: http://nelson.csie.us
My Blog: http://blog.nelson.csie.us
flair
一般會員


發表:0
回覆:4
積分:0
註冊:2003-04-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-03-07 01:20:23 IP:59.121.xxx.xxx 訂閱
if (WaitForSingleObject(pi.hProcess, INFINITE) != SYNCHRONIZE) {
GetExitCodeProcess(pi.hProcess,&dwExitCode);
}

可否加入什麼,令其不主程式,還能動作,而不會hold住在等a.exe程式結束都不能做其他事了

flair
一般會員


發表:0
回覆:4
積分:0
註冊:2003-04-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-03-07 01:27:55 IP:59.121.xxx.xxx 訂閱
if (WaitForSingleObject(pi.hProcess, INFINITE) != SYNCHRONIZE) {
GetExitCodeProcess(pi.hProcess,&dwExitCode);
}

可否加入什麼,令其不主程式,還能動作,而不會hold住在等a.exe程式結束都不能做其他事了

rogan321
高階會員


發表:21
回覆:307
積分:200
註冊:2003-05-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-03-24 16:10:33 IP:219.68.xxx.xxx 訂閱
在B執行完後或執行失敗時, 傳個message 給A 
MS上面公開給程式開發者使用的訊息代碼是WM_COPYDATA
自己再定義要傳的值代表意義


暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2007-03-24 19:19:45 IP:220.131.xxx.xxx 訂閱
在 .bat 中用 if errorlevel == -1 ......
這種方式。
PS 語法太久沒用了。可能你要查一下。
用 bat 檔就可以做到你說的動作了。
===================引 用 文 章===================
int main()
{
    if (非預期結果)
        return -1;
    ..................

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