一個 EXE 如何知道自己的 HWND? |
答題得分者是:Justmade
|
ycchin
一般會員 發表:4 回覆:3 積分:1 註冊:2003-06-12 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
1. EXE 本身是沒有 HWND (Handle of Window) 的 ,是他的 Controls 有 HWND。若一個 EXE 有 Controls (如 Form) 即使沒顯示出來,也會有 Control 的 HWND。反之若完全沒任何 Control 便沒 HWND。
2. 雖說 EXE 本身沒有 HWND,但有時也會有人把 EXE MainForm 的 HWND 當成是 Application 的 Handle。在 Delphi 程式中可使用
Application.Handle 取得 但其實直正的 Application Handle 應是 HInstance (可直接用 HInstance 取得)
3. 若你的 OCX 有Control, 可通過一連串的 GetParent 來取得。
|
ycchin
一般會員 發表:4 回覆:3 積分:1 註冊:2003-06-12 發送簡訊給我 |
先謝謝您的回應
其實我要實作的程式是, 有一 admin 程式, 會有一 ini 檔記錄其所管理的幾組 exe path name. (exe 是別人寫的, 我提供他 ocx)
admin 使用 indy web server 接受 request, admin 及 exe 是用 indy tcp socket 溝通, 工作是由 exe 完成, 再回給 admin 程式.
admin 發現負荷增加時, 會 createprocess exe, 負荷輕時也會 terminateprocess exe.
本來可以直接記錄 exe 的 TProcessInformation.hProcess 就可以了,
不過由於 exe 開起來時, 會自動 bind tcp port, 所以希望 exe 可以回報
tcp port 及 hwnd.
對於如此架構, 請問有沒有更好建議?
--
我做的測試
Q1: prog1
showmessage(inttostr(self.handle)
showmessage(inttostr(application.handle)
showmessage(inttostr(hinstance)
此三者回應的值都不同, 可否釋疑?
Q2: prog2
在另一程式, 用 edit1 抄上述三值
terminateprocess(strtoint(edit1.text),0)
都無法 kill prog1
請問應如何做才正確
thanks!
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
TerminateProcess 的參數是 hProcess,建議你在 CreateProcess 時記下這個 hProcess 留作 Terminate Process 用 你可以 CreateProcess 時記下 TProcessInformation.hHandle 及 TProcessInformation.dwProcessId
Exe 可以用 GetCurrentProcessId 來回傳自己的 ProcessID 之後 exe 與 admin 可以用 ProcessID 作識認,再以 hProcess 來 TerminateProcess
var SI : TStartupInfo; PI : TProcessInformation; begin FillChar(SI, SizeOf(SI), 0); SI.cb := SizeOf(SI); CreateProcess(nil,'SplashCount.exe', nil, nil, False,NORMAL_PRIORITY_CLASS, nil, nil, SI,PI); xxx := PI.hProcess; yyy := PI.dwProcessID; ..... ..... end; TerminateProcess(xxx,0); // 關掉外部程式 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |