線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3855
推到 Plurk!
推到 Facebook!

如何偵測winxp已經開完機?

答題得分者是:Coffee
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-09-30 00:34:53 IP:61.67.xxx.xxx 未訂閱

請問各位!

我寫一支socket程式在server 端, 另外在client端也有一支偵測server主機是連線的socket程式, 如果偵測連線ok的話, 就到主機端連接資料庫-> 開啟資料庫-> 執行程式, 但這支程式我必須放在xp系統的啟動中, 這樣產生了一個問題, 每一台xp的開機速度都不一樣, 有的開的很快, 有的開的很慢, 開的快的(就是網路連線已上來的), xp進入啟動連線我的程式連上主機一切都沒有問題, 但開的慢的, 網路連線還沒有啟動, 就進入[啟動]執行我的程式, 結果造成我的程式偵測無法連線我的主機, 使得程式跳出, 所以我想, 如果可以偵測xp系統已經開完機後, 我再進行我的程式中網路偵測的一段程式碼(就算我的程式被先啟動, 我也可以偵測 xp到開機完成後我再進行), 那要如何做才能知道xp已經完全開機完成了, 謝謝!

lcjan
初階會員


發表:11
回覆:60
積分:29
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-12-06 19:40:57 IP:61.59.xxx.xxx 未訂閱
這個問題我覺得有點疑問。
Client端的電腦在登入前應該會先啟動網路吧!?如果沒啟動網路,那你在登入畫面所打的帳號密碼如何與你的網域主控站(AD)進行驗證動作?還是您的應用程式必須在登入前被執行呢?如果是的話,是不是寫成Service。
不好意思,我不是找碴也不是幫您解答,只是提出我的疑問....
P.D.
版主


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-12-06 23:49:42 IP:61.67.xxx.xxx 未訂閱
不知道我這樣說是否正確?
WINDOW在登錄前其實網路是還沒有連線的, 因為我發現當使用者登入之後才會依序啟動一些程式, 例如NAVIDA的驅動, 輸入法, 而通常網路連線是在很後面才會被啟動, 而我有一支程式是要掛在啟動區來執行連線到我的主機資料庫, 但往往在啟動區內的程式都會優先於網路連線動作之前被執行, 所以就會造成我的程式一直在嘗試連線主機, 最後會當機出錯, 因此如果我能在程式中加入偵測XP已完成網路連線後, 我再啟動程式連主機, 就不會造成連線資料庫因TIMEOUT而出問題!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-12-07 09:15:17 IP:219.87.xxx.xxx 未訂閱
所以重點該是 網路已經連上, 而不是 WinXP 已經該機完成
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-12-07 09:15:41 IP:219.87.xxx.xxx 未訂閱
偵測網路是否連線

unit Unit1;
interface
uses
Windows, Messages, SysUtils, wininet,Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
Types : Integer;
begin
{ CopyRight (C) Bowman }
{ MatthewBowman@21cn.com }
Types := INTERNET_CONNECTION_MODEM
INTERNET_CONNECTION_LAN
INTERNET_CONNECTION_PROXY;
//check 3 conditions together

if InternetGetConnectedState(@types, 0) then
Edit1.Text := 'your pc is Online now'
else
Edit1.Text := 'your pc is offline now';
end;
end.

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-12-07 09:16:18 IP:219.87.xxx.xxx 未訂閱
再來另一個
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
if GetSystemMetrics(SM_NETWORK) and $0001 = $0001 then
edit1.text:='Machine is OnLine'
else
edit1.text:='Machine is OffLine';
end;
end.

------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
lcjan
初階會員


發表:11
回覆:60
積分:29
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-12-07 17:56:50 IP:211.23.xxx.xxx 未訂閱
WINDOW在登錄前其實網路是還沒有連線的
關於這一點我做了一個簡單的測試,使用A電腦一直Ping B電腦,然後把B電腦重新開機,當B電腦開到Win XP的登入畫面時,A電腦的Ping就已經有回應了。這表示B電腦雖然沒有任何人登入,但網路連線是正常的(除非您是登入後需要撥接ADSL或VPN)。
另一個例子,如果你用過VNC遠端連線到某電腦,當你把遠端電腦重新開機後,等一段時間後您就可以利用VNC遠端連線並且登入電腦,如果該電腦沒有使用者登入就沒網路連線的話,那很多伺服器一重開機MIS人員不就得臨機處理?

===================引 用 文 章===================

不知道我這樣說是否正確?
WINDOW在登錄前其實網路是還沒有連線的, 因為我發現當使用者登入之後才會依序啟動一些程式, 例如NAVIDA的驅動, 輸入法, 而通常網路連線是在很後面才會被啟動, 而我有一支程式是要掛在啟動區來執行連線到我的主機資料庫, 但往往在啟動區內的程式都會優先於網路連線動作之前被執行, 所以就會造成我的程式一直在嘗試連線主機, 最後會當機出錯, 因此如果我能在程式中加入偵測XP已完成網路連線後, 我再啟動程式連主機, 就不會造成連線資料庫因TIMEOUT而出問題!
P.D.
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2006-12-07 22:51:17 IP:61.67.xxx.xxx 未訂閱
感謝 lcjan兄測試, 不過lcjan兄可能有些誤解我的意思了, 您的A PING B, B重新開機到登入畫面, A PING得到 B這是當然的, 因為B進入XP登錄時網卡已開始運作, 但我的 A 是 CLIENT端, B是主機(主機是不關機的), 當A開機登入後, 在BOOT區有一支程式會主動被執行, 同時因為在我的B SERVER上有一支 SOCKET SERVER, A 有一支 SOCKET CLIENT啟動時會探測B SERVER是否存在, 如果存在則開始嘗試連接資料庫(資料庫為 INTERBASE, 直接透過TCP/IP方式連線), 如果啟動中 A 探測不到 B SERVER的回應, 就立即跳出, 而現在的狀況是 A 已探測到 B的存在了, 接下來立刻嘗試連結 B SERVER的資料庫, 可是這個時候, A的系統其實還沒有完全開好, 也就是在網路還沒有READY好要透過TCP/IP來做雙向資料傳輸, 在控制台-網路設定中有一個CHECKBOX是 "連線後,在通知區域內顯示連線"的選項, 如果這個被點選的話, 當A的網路已READY後會在TRAY BAR右下出現網路連線圖示, 我的意思是如果這個圖示沒有被顯示出來時, 我的程式在 A CLIENT是無法連通 B SERVER的, 所以我希望是能偵測到這個動作完成後再進行 A 連 B的作業, 以免因為連線過長出現 TIMEOUT問題而導致當機, 但很可惜, WINXP從啟動到網路連線這段時間因每台電腦狀況不同, 有的可能只要1分鐘, 有的可能要長到4-5分鐘, 所以我沒有辦法去寫一個迴路去計算, 這也是我一開始就說, 要如果能偵測XP在 IDLE的閒置下, 一定代表所有東西都開好了, 或許我用語不清有些誤解, 造成各位麻煩, 實在抱歉, 不過樓上各位有提出的方法我會一一測試, 看看是否有幫助, 謝謝!
lcjan
初階會員


發表:11
回覆:60
積分:29
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2006-12-08 02:47:35 IP:218.170.xxx.xxx 未訂閱
P.D.兄您好:
我提供一下我的經驗, 我也寫過一支Client - Server 程式, 用Delphi 5 的 ClientSocket 與 ServerSocket, Client端也是在電腦登入後會自動執行, 然後連上主機, 上傳資料, 但我不是上傳到資料庫. 這樣的方式沒有遇到開機登入緩慢而導致無法上傳. 還是您的資料庫連線在Client端需要先執行必要的驅動程式或函式庫, 但在您登入初始化時資料庫連線Driver尚未被執行而您的程式就先跑起來.
您要不要考慮登入後遞延幾秒執行, 再加上失敗後重複嘗試連線幾次..試試
P.D.
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2006-12-08 09:26:11 IP:61.67.xxx.xxx 未訂閱
謝謝您支持, 
1.因為我寫的是一支資料庫管理應用程式(前台門市作業), 所以一定是要連資料庫, 但至於interbase(firebird)資料庫系統透過TCP/IP來連結的過程如何, 沒有文獻可以查詢, 所以這個問題很難解決
2.延遲幾秒的問題, 就如我之前所說, 每一台開機狀況都不同, 延遲迴圈很難掌握, SOCKET部份在XP一開機立即可偵測, 接下來要等多久, 不是我能控制, 我的經驗, 在一台PC剛裝好XP時, 約在1分鐘內可完成XP開機, 此時我放在啟動中執行是沒有問題, 而大多數用了約4-5個月後, 同樣在啟動的程式卻會出現TIMEOUT, 所以我現在都把啟動中的程式移到桌面, 然後告訴客戶等XP開完在手動點選執行, 只是這樣在於門市系統似乎怪怪的!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2006-12-08 09:50:43 IP:219.87.xxx.xxx 未訂閱
A 要知道 B 是否 ready , 只要直接抓取資料庫內容, 抓得到就表示 ready, 抓不到就間隔一分鐘再抓, 直到抓到表示 ready
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
P.D.
版主


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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2006-12-08 13:24:56 IP:61.67.xxx.xxx 未訂閱
說對了, 我只要連上B的資料庫就可以知道是否READY, 但問題是, 當我下CONNECT要連資料庫之後, 系統就卡住了, 因為它在嘗試連資料庫, 直到出現TIMEOUT, 就我所知, MS-SQL下CONNECT之後約莫45-60秒內如果連不上會出現TIMEOUT而當出, INTERBASE約在90-120秒之間, 而我就是希望避開這樣的問題, 也就是我不希望是因為下CONNECT連資料庫出錯才知道連線未READY, 而是能事先就知道XP的網路連線READY後, 我再進行 CONNECT , 雖然結果是一樣, 但是對設計除錯上來說意義卻完全不同, 因為一旦出現TIMEOUT 我不知道後面是否會有其他的後遺症發生, 所以當然是不要錯最好, 不是嗎? 謝謝!
Coffee
版主


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2006-12-08 13:33:58 IP:220.228.xxx.xxx 未訂閱
那麼..這樣如何..利用Connection來連線..當Exception產生時就拋出false,既不會真正把Exception丟給User,也不會讓程式出問題。

function GetConnection(var ADOConnection : TADOConnection):boolean;
begin
try
ADOConnection.Open;
Result:=ADOConnection.Connected;
except
Result:=false;
end;
end;

procedure TForm.InitialProc;
begin
while (not CancelInitial) do
begin
if GetConnection(aADOConnection) then break
else sleep(20*1000);
end;
end;
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
P.D.
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2006-12-08 15:56:49 IP:61.67.xxx.xxx 未訂閱
感謝 Coffee兄的指教, 但這不是我希望的做法, 因為還是會卡在 connection的步驟, 雖然說利用 try...except 來避開錯誤訊息顯示給user看, 但實際面它還是發生錯誤, 而且還是那句話, 一旦下 connect 而連不上資料庫, 會出現timeout的等待時間, 這段時間也會造成有些xp判斷成沒有回應的狀況, 或者user因為等很久以為當機就開始亂點, 亂按, 反而出現更多的問題!
Coffee
版主


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2006-12-08 16:19:25 IP:220.228.xxx.xxx 未訂閱
那麼就讓程式在未初始化完成的時候不要出現視窗,留個TrayIcon就好,
如果要讓User 知道目前的進度,就產生第二個Form來播放Progress Bar,
這也就是為什麼我會有個Cancel的flag在那,這麼一來程式不會看起來當掉,
另外User也只有Cancel的Button可以按(或者是在你認為的某些時機下去控制flag讓程式停止)
我是認為這樣的Exception是可以被控制的,雖然說已經拋出,但在預定的flow已經被控制,我認為仍然是可行的。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
lcjan
初階會員


發表:11
回覆:60
積分:29
註冊:2002-03-13

發送簡訊給我
#16 引用回覆 回覆 發表時間:2006-12-08 22:40:30 IP:218.170.xxx.xxx 未訂閱
那初始化連線時每次使用一依個執行緒去嘗試連線, 主畫面並不會受影響而沒回應, 如果執行緒尚連線成功回傳訊息, 且主程式不再嘗試連線, 不曉得這樣行嗎
P.D.
版主


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2006-12-08 23:10:13 IP:61.67.xxx.xxx 未訂閱
感謝兩位回覆, 我想重點不在於嘗試連線的問題打轉, 其實我想的很單純, 就只要能偵測網路連線的狀態已出現ready, 我才進行connect動作, 因為兩位提到的初始化動作, 我心裡有個疑問, 如何才是所謂初始完成? 如果得知初始完成? 我的程式中要連結十幾個不同的資料庫, 總不能每個資料庫都去嘗試連結, 回應錯誤, 而我的資料庫是開放參數設定, 所以不一定那一個會被設定成連server, 那一個連client本機, 這複雜度太高!!!
Coffee
版主


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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2006-12-10 15:17:19 IP:203.73.xxx.xxx 未訂閱
所以..你想要的是像這個?

Case WNetAddConnection3(Application.Handle, netRes,PChar(PassWord) , PChar(PassWord),
CONNECT_UPDATE_PROFILE) of
NO_ERROR: Result := '連線完成';
ERROR_ALREADY_ASSIGNED: Result := '本地磁碟機字元已經被指定 '#13#10 Driver ':'
MappingDriverRemoteName(Driver);
ERROR_ACCESS_DENIED: Result := '存取網路資源被拒';
ERROR_BAD_DEV_TYPE: Result := '本地設備形態與網路資源不符合';
ERROR_BAD_DEVICE: Result := '本地磁碟機字元無效';
ERROR_BAD_NET_NAME: Result := '網路資源名稱無效';
ERROR_BAD_PROFILE: Result := 'The user profile is in an incorrect format.';
ERROR_BAD_PROVIDER: Result := 'The value specified by lpProvider does not match any provider.';
ERROR_BUSY: Result := '網路忙碌中';
ERROR_CANCELLED: Result := '使用者取消網路連線';
ERROR_CANNOT_OPEN_PROFILE: Result := 'The system is unable to open the user profile to process persistent connections.';
ERROR_DEVICE_ALREADY_REMEMBERED: Result := '網路資源已經連線';
ERROR_EXTENDED_ERROR:Result := '網路發生錯誤';
ERROR_INVALID_PASSWORD: Result:='密碼無效';
ERROR_NO_NET_OR_BAD_PATH: Result := '網路元件未啟動';
ERROR_NO_NETWORK: Result := '網路不存在';
end;
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
P.D.
版主


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

發送簡訊給我
#19 引用回覆 回覆 發表時間:2006-12-10 19:16:00 IP:61.67.xxx.xxx 未訂閱
感謝 coffee 提供這段判斷, 看樣子是蠻像我要的, 我會再找時間測試一下(因為這個案子現在是結案, 所要測試我還要安排作業進度), 有進一步消息, 我會告知結果如何, 謝謝!
Coffee
版主


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

發送簡訊給我
#20 引用回覆 回覆 發表時間:2006-12-10 19:34:41 IP:220.228.xxx.xxx 未訂閱
我只是看到類似的,這個原本的討論串是在於加入新的NetResource,但是我翻了一下SDK發現其實還有蠻多類似的API可以用,你可以試試看。
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
系統時間:2024-04-18 10:42:37
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!