こんばんは。
Delphi初心者のジャンジャンと申します。
Windows Server 2008
Windows 7 マシンからなるクラサバ環境で
クライアントがサーバーにログオンしているかを
確認するプログラムを作成したいのですが、
DOSコマンドのpingのように
Delphiでログオン状態が確認できるプログラムは作成できるのでしょうか?
Ping は Indy の TIdIcmpClient で実現できます。
以下に単純な Ping の関数を記述しておきます。
uses
..., IdIcmpClient, IdStack;
interface
...
function SimplePing(AHost: string; ATimeout: Integer = 3000): Boolean;
implementation
...
function SimplePing(AHost: string; ATimeout: Integer): Boolean;
var
IcmpClient: TIdIcmpClient;
begin
result := False;
IcmpClient := TIdIcmpClient.Create;
try
with IcmpClient do
begin
Host := AHost;
PacketSize := 32;
ReceiveTimeout := ATimeout;
try
Ping;
result := True;
except
On E: EIdSocketError do
result := False;
end;
end;
finally
IcmpClient.Free;
end;
end;
...ですが、
Ping では、"ネットワークに TCP/IP 接続されているか?"という事しか判りません。
調べたいのは "特定のサーバに接続している PC" でしょうから、
"net session" の結果をリダイレクトして正規表現検索等で抜き出すか、
[net sessionコマンド (ITpro)]
http://itpro.nikkeibp.co.jp/article/COLUMN/20060704/242470/?ST=network
[552_パイプを使用したコマンドラインのリダイレクト (Mr.XRAY)]
http://mrxray.on.coocan.jp/Delphi/plSamples/552_PipeRedirect.htm
NetSessionEnum() API を使って調べる必要があると思います。
[NetSessionEnum (MSDN)]
http://msdn.microsoft.com/ja-jp/library/cc446950.aspx
私はここのコンポーネントを使用しています。
http://www.bvbcode.com/jp/0yck2dum-1656484
DEKOさん、ご回答ありがとうございます
教授いただいた通りコーディングしたら、
Tdldcmpcliant.createのところで
引数足りませんというエラーになりました。
なにが足りないのでしょうか?
deldelさん、ご回答ありがとうございます。
ご指示いただいたサイトを拝見しましたが、
はずかしながら、私の能力では難しすぎて
意味が理解出来ませんでした。
私の挑戦しようとしていることは
難しいでしょうか。
> Tdldcmpcliant.createのところで
> 引数足りませんというエラーになりました。
現行の Indy 10.x ではこれで通るハズですが、
お使いの Delphi は何でしょうか?
おはようございます。
DEKOさん、お返事ありがとうございます。
私の開発環境は以下の通りです。
Windows XP & Delphi7
Windows7 & Delphi2010
***********************
Delphi2010でコンパイルすると
「E2065 forwardまたはextemal宣言されたTfrmTest.SimplePingが見つかりません」というエラーが発生しました。
Delphi7 だと Indy のバージョン違いで、Tdldcmpcliant.Create の引数が違うと怒られる、と。
これについては
[ANSI 版 Delphi (5〜2007) に最新版の Indy10 をインストールする]
http://ht-deko.minim.ne.jp/tech034.html
で解決します。
次。
> Delphi2010でコンパイルすると
> 「E2065 forwardまたはextemal宣言されたTfrmTest.SimplePingが見つかりません」というエラーが発生しました。
エラーメッセージの通りですが、implementation (定義部) にしかコードを書かれていないようですね。
interface (宣言部) の下、implementation (定義部) の上に、
> function SimplePing(AHost: string; ATimeout: Integer = 3000): Boolean;
を記述してください (元ソースでもそうなっていると思います)。
# この掲示板に限らない話ですが、質問の際は Delphi のバージョンとエディション、
# 場合によっては VCL / FMX どちらなのかを面倒臭がらずに記載して下さい。
interface / implementation セクションの理解があやふやな場合には
以下のドキュメントを参照して下さい。
[プログラムとユニット(Delphi)]
http://docwiki.embarcadero.com/RADStudio/XE3/ja/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A8%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88
# C/C++ で言う "関数のプロトタイプ宣言" です。
# Delphi ではそれを記述する場所 (セクション) が決められています。
> TfrmTest.SimplePingが見つかりません
提示したコードはクラスのメソッドではなく "単なる関数" ですので、
implementation (定義部) に記述する際に、
function TfrmTest.SimplePing(AHost: string; ATimeout: Integer): Boolean;
var
IcmpClient: TIdIcmpClient;
begin
...
のようにクラス名 (TfrmTest.) を付ける必要はありません。
上のほうに、
「個別にダウンロードping.pasソースコード」
というのがありますから、ここからping.pasというファイルをダウンロードできます。
あとは普通のコンポーネントと同じようにインストールすれば使用できます。
ツイート | ![]() |