運行外部程式并等待外部程式結束才回傳結果的函式在下面
function WinExecAndWait32(FileName: string; Visibility: Boolean): integer;
var
zAppName: array[0..512] of char; //存放應用程式名
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
exitCode: Dword;
aVisibility: integer;
begin
StrPCopy(zAppName, FileName);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
//給StartupInfo結構體賦值
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
if Visibility then
aVisibility := 1
else
aVisibility := 0;
StartupInfo.wShowWindow := aVisibility;
//呼叫CreateProcess 創建行程,執行指定的可執行檔案
if not CreateProcess(nil, zAppName, nil, nil, false
, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS
, nil, nil, StartupInfo, ProcessInfo) then
Result := -1
else
begin
//等待可執行檔案退出
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
//得到行程終止狀態碼
GetExitCodeProcess (ProcessInfo.hProcess, exitCode);
result := exitCode;
end;
end;
如何修改一下變成我需要的功能,很多人說修改為WaitForInputIdle
但是我真的一點都不懂啊
uj5u.com熱心網友回復:
運行外部程式并等待外部程式運行完畢和
運行外部程式并等待外部程式運行結束
有什么區別嗎?
uj5u.com熱心網友回復:
我上面貼出的函式是:執行的這個外部程式必須關閉以后,才能繼續向下執行
而我要的效果是,執行的這個外部程式完全打開以后(主表單創建完畢)就開始繼續向下執行,這個外部程式并不關閉。
uj5u.com熱心網友回復:
云里霧里啊 LZuj5u.com熱心網友回復:
那得用行程間通訊,不然外面不可能知道你呼叫的程式什么時候把主表單創建完。uj5u.com熱心網友回復:
http://topic.csdn.net/t/20030218/13/1439470.html看下這個帖子吧,我和這個發帖人遇到的是同樣的問題。
uj5u.com熱心網友回復:
那直接winexec(...)就可以了吧
uj5u.com熱心網友回復:
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
第2個引數可以是時間,單位是毫秒;
如果都是用具體的時間,沒啥區別,都是在等待指定的時間,時間到就回傳,不管被啟動的程式是否啟動成功
若是INFINITE,即永遠等待下去,不受時間限制(取決于被啟動程式執行的時間)
區別在于前者要等到程式完全執行結束才回傳,即從create到close
而后者是,create完畢就回傳,所以你的程式可以用WaitForInputIdle這個函式
uj5u.com熱心網友回復:
哎,還是沒解決,郁悶阿uj5u.com熱心網友回復:
可以回圈監測主視窗是否找到!while FindWIndow(類名, 標題) = 0 do
begin
Application.ProcessMessages;
Sleep(100)
end
uj5u.com熱心網友回復:
WaitForInputIdle 好像不起作用,行程的主視窗還沒創建就執行過了,導致取不到行程視窗句柄,無從操作uj5u.com熱心網友回復:
用一下行程通信 命名管道,都封裝好了uj5u.com熱心網友回復:
菜鳥飄過,不明白外部程式不關閉的情況下,怎么會有ExitCode回傳?轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/118728.html
上一篇:字串還原
