無邪気に未来を考える

コンピューティングの未来などを考えると、人類の未来まで見えてきそう。

■Delphiを用いて
 「ローカルIPアドレス」、「ローカルホストネーム」の取得方法

Delphiで、自PCのローカルIPアドレス等の取得が簡単なコーディングで実現。
使用しているIndyユニットの情報は英語が主で、私には不得手ですが、
この使い方は外国のWebサイトのサンプルのソースコードから見つけました。

Delphiのバージョンは2007ですが、
試しにDelphi7でも実験。一部プロパティの修正で正常に動作しました。
ということは、かなり昔からこの使い方ができたんですね。

下記コードは全文ですので、簡単にコピーして実験できると思います。
(フォーム1個にボタン1個、尚下記コードには全角スペースが混入)

unit Unit1;
interface

uses
 Windows, Messages, SysUtils, Variants, Classes,
 Graphics, Controls, Forms, Dialogs, StdCtrls,
 IdUDPClient, IdStack;                 // <--- 追加

type
 TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
 end;

var
Form1: TForm1;

implementation

{$R *.dfm}

// ----- IpAddress,Host 取得 -----

procedure TForm1.Button1Click(Sender: TObject);
var
 IdUDP:TIdUDPClient;
 LocalAddress,LocalHostName : string;
begin
 IdUDP := TIdUDPClient.Create(Self);        // この4行がミソ?
 LocalAddress := GStack.LocalAddress;       //
 LocalHostName := GStack.HostName;       // Delphi 2007の場合
//LocalHostName := GStack.WSGetHostName;  // Delphi 7の場合

 showmessage(LocalAddress + ' - ' + LocalHostName);
 IdUDP.Free;
end;

end.


ところで、
上記ロジックを調べた目的は、Delphiで作成したシステムでセキュリティ改善の為、
ログデータ生成の要求があり、
システム稼動時の操作状況を、端末情報やWindowsのログインユーザーも含めて
DBに吐き出すため。


追記 2/19
ところで、上記の使い方のヒントは下記URLの「Let’s UDP Chart!」からです。
http://delphi.about.com/library/weekly/aa101105a.htm
(添付の広告は怪しいのですが、変なところをクリックしなければ問題無いみたい)

後で知ったのですが、下記サイトで紹介されているWinSockでの実現方法は、
同じソースでDelphi2007とDelphi7で正常に動作しましますので、こちらの方が良さそう!

DelFusa Floor
http://delfusa.main.jp/delfusafloor/technic/technic_f.html
「自マシンのIPアドレスとホスト名(マシン名)を得る方法 2008/01/18(金)」

こんにちはーー。
うちへのリンクありがとうございます。

これって、NIC=NetworkInterfaceCard
つまり、LANカード、2枚ざしの場合、どちらのIPも出力したくなるんですけど、どうやったらいいんでしょうね。
うちのコードでも求める方法わかりませんでした。

ところで、DelphiのFTが始まったみたいっすね。楽しみです。

2008.04.03 13:24 URL | ミ・д・彡 #mQop/nM. [ 編集 ]

どうもです!
ご無沙汰しております。

LANカード2枚差しの時のIP取得方法とは..難しそう?

そもそも、難解なWindowsのAPIに関わりたくないから、
MSのC++ではなくDelphiを愛用している訳で、苦手な領域です。

でも、面白そうなテーマですから、長期戦で考えてみたいですね..

2008.04.03 14:14 URL | たにぐちです #- [ 編集 ]

はじめまして
INDYの情報は少ない中、参考にさせて頂きました。
ありがとうございました。

ところで、もう解決してるかもしれませんが
複数IPアドレスの取得は
GStack.LocalAddress
の代わりに
GStack.LocalAddresses
を使えば可能ですね。

2008.06.27 11:57 URL | SATOSHI #- [ 編集 ]

SATOSHIさん
複数IPアドレスの情報ありがとうございます。
早速、次のコードで実験してみました。簡単ですね!

for i := 0 to GStack.LocalAddresses.Count - 1 do
memo1.Lines.Add(GStack.LocalAddresses[i]);

戻り値がTStringListのも気にしないとですね。
というより、複数IPを取得する機能が入っているとは..予想外。

2008.06.27 13:48 URL | たにぐちです #- [ 編集 ]













管理者にだけ表示

トラックバックURL↓
http://afftec.blog72.fc2.com/tb.php/91-afa6cc9e