Delphi 2009 如何使用 IdStack 取得 IP 值? |
缺席
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
Delphi 2009 如何使用 IdStack 取得 IP 值?
[code delphi] uses IdStack; // 要有 IdStack function GetAllIP:String; var IdStack: TIdStack; begin //IdStack := TIdStack.CreateStack; // Delphi 7, 可以 IdStack := TIdStack.Create; // Delphi 2009, 失敗, 不知為何 try Result := IdStack.LocalAddresses.Text; finally IdStack.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Add(GetAllIP); end; end. [/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
HikaruGo
中階會員 發表:22 回覆:69 積分:88 註冊:2007-12-09 發送簡訊給我 |
Trce indy Code ..
版大可能誤會了 OOP IdStack: TIdStack; function GetLocalAddresses: TIdStrings; virtual; abstract; property LocalAddresses: TIdStrings read GetLocalAddresses; 引用的Code為 abstract 故尚未時作 故你引用需要有演生的Class 如 TIdStackWindows Sample Code : uses IdStackWindows; function GetAllIP:String; var IdStack: TIdStack; begin IdStack := TIdStackWindows.Create; try //Result := IdStack.LocalAddress; Result := IdStack.LocalAddresses.Text; finally IdStack.Free; end; end; 沒有Calss 階層表所以只能用猜的 TIdStackWindows 是我猜的... 參考 IdStackXXXX.pas Trace code procedure TIdStackWindows.PopulateLocalAddresses; type TaPInAddr = Array[0..250] of PInAddr; PaPInAddr = ^TaPInAddr; var i: integer; AHost: PHostEnt; PAdrPtr: PaPInAddr; begin FLocalAddresses.Clear ; AHost := GetHostByName(PChar(HostName)); if AHost = nil then begin CheckForSocketError(SOCKET_ERROR); end else begin PAdrPtr := PAPInAddr(AHost^.h_address_list); i := 0; while PAdrPtr^[i] <> nil do begin FLocalAddresses.Add(TranslateTInAddrToString(PAdrPtr^[I]^,Id_IPv4)); //BGO FIX Inc(I); end; end; end; 若單純List IP 不必引用 外掛的Lib ,對Code維護是一大負擔,,況且Lib 可能會 init 一些memory 之類的. 簡單精準是最好的上策 ===================引 用 pcboy 文 章=================== Delphi 2009 如何使用 IdStack 取得 IP 值? |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
查到了 ( 雖然還是沒搞動 abstract base class )
TIdStack is an abstract base class. Do not instantiate it directly. Use the global GStack variable instead. Call the TIdStack.IncUsage() class method to ensure GStack is intialized before accessing it, ie: [code delphi] uses IdStack; function GetAllIP: String; begin TIdStack.IncUsage; try Result := GStack.LocalAddresses.Text; finally TIdStack.DecUsage; end; end; [/code]
Note - the TIdStack.LocalAddesses property is not thread-safe. If you have threads involved, a safer approach would be to use the TIdStack.AddLocalAddressesToList() method instead, ie: [code delphi]uses IdStack; function GetAllIP: String; var List: TStringList; begin List := TStringList.Create; try TIdStack.IncUsage; try GStack.AddLocalAddressesToList(List); finally TIdStack.DecUsage; end; Result := List.Text; finally List.Free; end; end; [/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2009-05-06 07:24:40, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |