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

如何判斷CreateOleObject已經開啟?

答題得分者是:P.D.
fireflybug
一般會員


發表:18
回覆:36
積分:15
註冊:2008-07-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-04 15:43:11 IP:220.130.xxx.xxx 訂閱
各位大大好,請問如何判斷下面的程式碼已經成功開啟EXCEL? 因為弟想再退出程式按鈕內前面先判斷是否已經開啟這段程式,然後再執行    V.WorkBooks.close; 與   V.Quit; 退出EXCEL,這樣程式管理員的程序才不會看到一堆EXCEL程序卡在那邊。

V:=CreateOleObject('Excel.Application');

或是也更好得方式?可指點一二,謝謝。
------
今天的事,留到後天再說....
fireflybug
一般會員


發表:18
回覆:36
積分:15
註冊:2008-07-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-04 15:57:49 IP:220.130.xxx.xxx 訂閱
承上題,弟剛看到這個用法,利用變數是否有值,來判定剛剛的 CreateOleObject('Excel.Application') 是否有開啟執行了,試過後可行,謝謝大家。

if not VarIsEmpty(V) then

===================引 用 fireflybug 文 章===================
各位大大好,請問如何判斷下面的程式碼已經成功開啟EXCEL? 因為弟想再退出程式按鈕內前面先判斷是否已經開啟這段程式,然後再執行 V.WorkBooks.close; 與 V.Quit; 退出EXCEL,這樣程式管理員的程序才不會看到一堆EXCEL程序卡在那邊。

V:=CreateOleObject('Excel.Application');

或是也更好得方式?可指點一二,謝謝。
------
今天的事,留到後天再說....
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-04 23:26:13 IP:61.67.xxx.xxx 未訂閱
CreateObject 一般都會在 Process 中建立一個 程序點 (Process Entry),你可從工作管理員中找到這個Object
這是我自己在使用搜尋 Process 的工具, 參考看看, 你必須 USES ComObj


[code delphi]
function FindProcWnd(ProcName: string): boolean;
var OK: Bool;
hPL: THandle;
ProcessStruct: TProcessEntry32;
begin
Result:= False;
hPL:= CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
ProcessStruct.dwSize:= SizeOf(TProcessEntry32);
OK:= Process32First(hPL, ProcessStruct);
while OK do begin
if UpperCase(ProcessStruct.szExeFile) = UpperCase(ProcName) then
begin
Result:= True;
end;
OK:= Process32Next(hPL, ProcessStruct);
end;
CloseHandle(hPL);
end;

[/code]

用法
if FindProcWnd('EXCEL.EXE') then showmessage('EXCEL 已建立')
benshaoxw
一般會員


發表:1
回覆:6
積分:1
註冊:2008-11-05

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-05 10:52:47 IP:121.234.xxx.xxx 訂閱
CreateObject 一般都會在 Process 中建立一個 程序點 (Process Entry),你可從工作管理員中找到這個Object
------
我就是我
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-05 16:15:23 IP:116.59.xxx.xxx 未訂閱
我不知道是我用的不精還是另有原因, 這種用法我之前使用10次至少有4次以上沒有辦法判斷的出來!
===================引 用 fireflybug 文 章===================
承上題,弟剛看到這個用法,利用變數是否有值,來判定剛剛的 CreateOleObject('Excel.Application') 是否有開啟執行了,試過後可行,謝謝大家。

if not VarIsEmpty(V) then

===================引 用 fireflybug 文 章===================
各位大大好,請問如何判斷下面的程式碼已經成功開啟EXCEL? 因為弟想再退出程式按鈕內前面先判斷是否已經開啟這段程式,然後再執行 V.WorkBooks.close; 與 V.Quit; 退出EXCEL,這樣程式管理員的程序才不會看到一堆EXCEL程序卡在那邊。

V:=CreateOleObject('Excel.Application');

或是也更好得方式?可指點一二,謝謝。
fireflybug
一般會員


發表:18
回覆:36
積分:15
註冊:2008-07-17

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-05 16:29:17 IP:220.130.xxx.xxx 訂閱
大大,有個疑惑,如果user已經自己開啟別的excel檔案,那好幾個程序都叫excel,分辨上似乎有問題,有辦法分辨嗎?

但是大大這個方式要尋找特殊已開啟的程式,倒是很好用,小弟收下啦!感恩^^

===================引 用 P.D. 文 章===================
CreateObject 一般都會在 Process 中建立一個 程序點 (Process Entry),你可從工作管理員中找到這個Object
這是我自己在使用搜尋 Process 的工具, 參考看看, 你必須 USES ComObj


[code delphi]
function FindProcWnd(ProcName: string): boolean;
var OK: Bool;
hPL: THandle;
ProcessStruct: TProcessEntry32;
begin
Result:= False;
hPL:= CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
ProcessStruct.dwSize:= SizeOf(TProcessEntry32);
OK:= Process32First(hPL, ProcessStruct);
while OK do begin
if UpperCase(ProcessStruct.szExeFile) = UpperCase(ProcName) then
begin
Result:= True;
end;
OK:= Process32Next(hPL, ProcessStruct);
end;
CloseHandle(hPL);
end;

[/code]

用法
if FindProcWnd('EXCEL.EXE') then showmessage('EXCEL 已建立')
------
今天的事,留到後天再說....
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-05 16:46:09 IP:59.124.xxx.xxx 訂閱
引用先前的討論,希望有幫助:

http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=89403

===================引 用 fireflybug 文 章===================
大大,有個疑惑,如果user已經自己開啟別的excel檔案,那好幾個程序都叫excel,分辨上似乎有問題,有辦法分辨嗎?

但是大大這個方式要尋找特殊已開啟的程式,倒是很好用,小弟收下啦!感恩^^

===================引 用 P.D. 文 章===================
CreateObject 一般都會在 Process 中建立一個 程序點 (Process Entry),你可從工作管理員中找到這個Object
這是我自己在使用搜尋 Process 的工具, 參考看看, 你必須 USES ComObj


[code delphi]
function FindProcWnd(ProcName: string): boolean;
var OK: Bool;
hPL: THandle;
ProcessStruct: TProcessEntry32;
begin
Result:= False;
hPL:= CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
ProcessStruct.dwSize:= SizeOf(TProcessEntry32);
OK:= Process32First(hPL, ProcessStruct);
while OK do begin
if UpperCase(ProcessStruct.szExeFile) = UpperCase(ProcName) then
begin
Result:= True;
end;
OK:= Process32Next(hPL, ProcessStruct);
end;
CloseHandle(hPL);
end;

[/code]

用法
if FindProcWnd('EXCEL.EXE') then showmessage('EXCEL 已建立')
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
fireflybug
一般會員


發表:18
回覆:36
積分:15
註冊:2008-07-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-11-05 17:24:47 IP:220.130.xxx.xxx 訂閱
嗯,謝謝大大,所以自己寫的程式,例外的部份要處理好,才不會有很多後遺症,如果程式處理得當,則程序就應該不會出現卡住的問題了,謝謝大大們^^


===================引 用 Coffee 文 章===================
引用先前的討論,希望有幫助:

http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=89403

------
今天的事,留到後天再說....
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-06 16:23:11 IP:219.68.xxx.xxx 未訂閱
這個方式的確對相同執行檔名的process是分不出來, 因為這是以processname來比對, 但每一個window program都會有一個不同的handle值, 或許你從這方向下手, 可以取得同樣是 excel 但不同handle的內容來做分辨, 這段我沒有深入研究, 所以你可能要搜尋 win32 api 的一些關鍵字來找找看, 如果有結論, 也歡迎你告訴大瘃!
===================引 用 fireflybug 文 章===================
大大,有個疑惑,如果user已經自己開啟別的excel檔案,那好幾個程序都叫excel,分辨上似乎有問題,有辦法分辨嗎?

但是大大這個方式要尋找特殊已開啟的程式,倒是很好用,小弟收下啦!感恩^^

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