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

GetExitCodeProcess的ExitCode一直是0

尚未結案
alvinken
初階會員


發表:21
回覆:32
積分:45
註冊:2008-06-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-19 08:47:11 IP:218.170.xxx.xxx 未訂閱

[code cpp]
DWORD ExitCode;
SHELLEXECUTEINFO ExecInfo;

ZeroMemory(&ExecInfo,sizeof(ExecInfo));
ExecInfo.cbSize = sizeof(ExecInfo);
ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ExecInfo.lpVerb = "open";
ExecInfo.lpFile = CPath.c_str();
ExecInfo.hwnd = this->Handle;
ExecInfo.nShow = SW_SHOWNORMAL;
ShellExecuteEx(&ExecInfo);
GetExitCodeProcess(ExecInfo.hProcess,&ExitCode);
while (ExitCode == STILL_ACTIVE)
{
GetExitCodeProcess(ExecInfo.hProcess,&ExitCode);
Application->ProcessMessages();
}
WinExec(MPath.c_str(),NULL);
[/code]


這是我用別人的deiphi程式改成BCB

但是不會執行到迴圈


ExitCode一開始的值就是0

程式都有順利執行

GetExitCodeProcess的值也都是 true


我後來有測試其他的外部程式是ok的


唯讀測試我要用的安裝程式不行


我是要寫能將好幾個安裝程式一個一個安裝起來

------
水至清則無魚,人至賤則無敵。
編輯記錄
alvinken 重新編輯於 2008-07-19 14:13:50, 註解 無‧
alvinken 重新編輯於 2008-07-21 13:30:01, 註解 無‧
alvinken 重新編輯於 2008-07-21 13:41:33, 註解 無‧
alvinken 重新編輯於 2008-07-21 16:32:04, 註解 無‧
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-21 12:39:28 IP:210.208.xxx.xxx 訂閱
改用 Win32 API CreateProcess 應該比較合適,你用關鍵字「CreateProcess」在本站搜尋,就可以找到相關的範例程式碼,例如:
http://delphi.ktop.com.tw/board.php?cid=168&fid=914&tid=71374
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-21 12:53:06 IP:61.66.xxx.xxx 訂閱
如果EXE執行的順序是有規律的話!!
建議用WINRAR包成自動解壓縮的執行檔來執行!!
這樣可以減少一些WINDOWS權限的問題~
------
======================
昏睡~
不昏睡~
不由昏睡~
alvinken
初階會員


發表:21
回覆:32
積分:45
註冊:2008-06-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-21 13:27:14 IP:218.170.xxx.xxx 未訂閱
我只是很好奇 ExitCode 一開始回傳的值是 0 <br>
而不是 STILL_ACTIVE, 不知是哪出問題

程式明明還在跑,怎一開始就回傳結束的值



ShellExecuteEx 也是我爬文看到別人用的

我也用過 ShellExecuteEx WaitForSingleObject

也是不行,都會造成全部的執行檔一起執行

------
水至清則無魚,人至賤則無敵。
編輯記錄
alvinken 重新編輯於 2008-07-21 13:27:49, 註解 無‧
wjhsu
初階會員


發表:9
回覆:32
積分:48
註冊:2004-06-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-21 16:08:09 IP:61.219.xxx.xxx 訂閱
下面的程式, 是我現在用的, 可以等到程式結束才離開迴圈, 
不知道你是否適用....

[code cpp]
STARTUPINFO StartInfo;

StartInfo.cb = sizeof(STARTUPINFO);
StartInfo.lpReserved = NULL;
StartInfo.lpDesktop = NULL;
StartInfo.lpTitle = NULL;
StartInfo.dwX = 0;
StartInfo.dwY = 0;
StartInfo.dwXSize = 0;
StartInfo.dwYSize = 0;
StartInfo.dwXCountChars = 0 ;
StartInfo.dwYCountChars = 0 ;
StartInfo.dwFillAttribute = 0 ;
StartInfo.dwFlags = STARTF_FORCEONFEEDBACK|STARTF_FORCEOFFFEEDBACK;
StartInfo.wShowWindow = 0;
StartInfo.cbReserved2 = 0;
StartInfo.lpReserved2 = NULL;
StartInfo.hStdInput = 0;
StartInfo.hStdOutput = 0;
StartInfo.hStdError = 0;

PROCESS_INFORMATION ProcInfo;
DWORD ExitCode;

if (!CreateProcess( ExecFileName.c_str(), // pointer to name of executable module
CmdLine.c_str(), // pointer to command line string
NULL, // pointer to process security attributes
NULL, // pointer to thread security attributes
FALSE, // handle inheritance flag
CREATE_DEFAULT_ERROR_MODE,// creation flags
NULL, // pointer to new environment block
NULL, // pointer to current directory name
&StartInfo, // pointer to STARTUPINFO
&ProcInfo) // pointer to PROCESS_INFORMATION
)
{ MyMsg("Can't execute the parameter setting program");
return false;
}

do
{ if (!GetExitCodeProcess(ProcInfo.hProcess,&ExitCode)) return false;
Application->ProcessMessages();
}
while(ExitCode == STILL_ACTIVE);

CloseHandle(ProcInfo.hProcess);

if (ExitCode > 2) return false; //設定失敗

return true;

[/code]
alvinken
初階會員


發表:21
回覆:32
積分:45
註冊:2008-06-09

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-22 09:14:56 IP:218.170.xxx.xxx 未訂閱
經過我個人的測試, 好像是程式RUN完後, 執行檔才開始跑<br>


所以才會無法達到我要的功能



用borland提供的程式包的執行檔還真怪

------
水至清則無魚,人至賤則無敵。
系統時間:2024-11-22 22:32:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!