2008-09-01から1ヶ月間の記事一覧
Javaのプログラムを呼び出す方法としては、コンソールからjava.exeを使って実行する方法が殆どで、例えばネットワークインターフェースの情報を取得するプログラムで利用したIfInfoTest.javaだと java -cp c:\java\net\classes net.test.IfInfoTestとして起…
折角ルート情報が取れるところまで出来たので、やっぱりルート情報の追加とか削除とかも欲しくなって作ってしまいました。 addRouteEntry(RouteInfo& entry) ルート情報の追加 deleteRouteEntry(RouteInfo& entry) ルート情報の削除 になります。 先ずは、Ro…
折角ルート情報を取得するクラスを作ったので、これをJavaのクラスとしても利用できるようにJNIで実装してみました。 いつもの様に RotueInfo.java package net; import java.util.Vector; public class RouteInfo { private int index = 0; private String …
インターフェース情報を取得できたので、同じIPHELPAPIを使ってルーティング情報を取得するクラスを作ることにしました。 ルーティング情報は、"route print"をコマンド実行して結果の文字列を処理して取得しないとファイルの一覧のようにWindowsのAPIでは取…
Javaの標準にあるInetAddressクラスの中で利用できるメソッドの幾つかをAddrInfoクラスに実装してみました。 実装したのは、 getAllByName(String hostname) パラメータで渡したホスト名(hostname)からIPアドレスリストを取得する。 getByName(String hostna…
ロジック中に ipaddress = String((_TCHAR *)_bstr_t(inet_ntoa(*(struct in_addr *)&pIPAddrTable->table[num].dwAddr))); のように、_bstr_tが多用されているのをみて、「何してるんだ」と思われている方も多いかもしれませんが、 これは使っているプログ…
ロジックに一部間違いがあったので、Loopbackインターフェース(MS TCP Loopback interface)にアドレスが表示されていなかった。 これは、アドレスをloadInterfaceInfoメソッド中のループで取得するように組み込んでいたのが間違いで、GetAdaptersInfo()関数…
JavaのNetworkInterfaceにある、getByInetAddress()メソッドを実装するために、C++のIfInfoクラスと、JNIにメソッドを追加しました。 ifinfo.h static IfInfo findInterfaceByAddress(String address); ifinfo.cpp /* * インターフェースの一覧から指定のIP…
作業を本題のJavaでネットワークインターフェースの情報を取得するロジックに戻して・・・。 単純に一覧にして取得するところまでは昨日のロジックで完了していたので、インターフェース番号からとインターフェース名から情報を取得するメソッドを追加します…
文字コードの問題が理解できたので、始めに作ったwmiも作り直してみました。 wmi.cppのgetString(VARIANT *value)メソッドでVT_BSTRを別ロジックにしていたのを、VT_BOOL以外同じロジックに集約しました。 /* * VARIANTデータを文字列値に変換し取得する * p…
色々と調べていくと、Javaでの表示とC++での表示で文字表示が一致していないのは、内部的なロケールの処理の問題でした。 IfInfo.cppの中のgetInterfaceList()メソッドとloadInterfaceInfo(IfInfo& if_table)を書き換えて /* * システムで利用可能なインター…
Javaのクラスは、取りあえずこんな感じにしてみました。 アドレスを持つクラスとして、 AddrInfo.java package net; public class AddrInfo { public static int IPADDR_PRIMARY = 0x0001; // Primary ipaddr public static int IPADDR_DYNAMIC = 0x0004; //…
JavaのNetworkInterfaceでgetName()メソッドを呼び出してもXP環境では文字化けして正しく表示できないばかりでなく、getByName()メソッドでは、通常Windowsで利用される"ローカル エリア接続"等では探すことが出来ません。 それで、自前でアドレス情報を取得…
色々やっていると欲が出てくるもので、VistaとXPに関しては昨日のロジックでなんら問題は無かったのですが、今度はWindows2000で表示できないというのが発覚しました。 最近ではWindows2000なんて殆ど見ることもなかったのですが、仕事の関係でWindows2000の…
Vistaのレジストリ情報とXPでは違っていたみたいで、このロジックでは取得できなくなってしまった。 WmiToolsを眺めていると、 Win32_PhysicalMediaに"SerialNumber"情報が入っていて、欲しい情報が取得できるみたいです。 WmiResult disk_drive = wmi.acces…
レジストリキーの HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\Scsi以下のTreeに \Scsi Port w\Scsi Bus x\Target Id y\Logical Unit Id z\SerialNumberという値が存在するので、これを利用することにしました。 Wmi32_DiskDriveを使って、次のようなロジックで…
マルチスレッドに対応するために、WmiCallをstaticで処理しないよう修正しました。 JavaのWmiCallのメソッドをstaticで無くして、 WmiCall.java package wmi; public class WmiCall { private long handle = 0; static { System.loadLibrary("jniwmi"); clas…
久々の更新です。 今日まで夏休みなんですが、どうしても気になっていたので作業することにしました。と言うのは、C++コンパイル時の文字コードを"MBCS"から"UNICODE"にすると漢字が化けてしまったので、これを補正するために修正しました。変更を加えたのは…