Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

.NETでLAN転送速度を測定するIEツールバーを作る

BandObjectsを使ったIE用ツールバーの作成

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2005/04/12 22:03

IEツールバーを作成するためには、今までは、C++, ATL などといった知識が必要でしたが、.NETでは、BandObjectsというフリーのクラスライブラリを利用することで、簡単にツールバーが作成できます。

LAN転送速度を測定するIEツールバー
LAN転送速度を測定するIEツールバー

はじめに

 今までは、IEツールバーを作成するためには、C++, ATL などといった知識が必要でした。.NETでは、そういった知識は必要なく、Pavel Zolnikov氏が作成したBandObjectsというフリーのクラスライブラリを利用することで、簡単にツールバーが作成できます。

 ここでは、サンプルとして、C#でPerformanceCounterを使ったLANの転送速度メーターを作成します。

必要な環境

  • Visual C# 2003(Visual Studio.NET 2003)以降
  • BandObjects

BandObjectsの入手・ビルド

 CodeProjectの記事「Extending Explorer with Band Objects using .NET and Windows Forms」より、BandObjectsを入手します。ソースコードにて配布されているので、まずはBandObjectsをビルドします。「<解凍したフォルダ>\BandObjectsLib\」の中にソースがありますので、ソリューションを開き、ビルドをします。「BandObjectLib.dll」と「Interop.SHDocVw.dll」が作成されるはずです。

BandObjectsはC#による開発
 BandObjects自体は、C#で開発されているので、自分なりにカスタマイズしたりすることが可能です。

プロジェクトの作成

 VS.NET(C#.NET)にて、新規プロジェクトを作成します。[ファイル]→[新規作成]→[プロジェクト...]を選択し、ダイアログで、[プロジェクトの種類]から[Visual C# プロジェクト]、[テンプレート]から[Windows コントロールライブラリ]を選択します。

 ここでは、例として「czPerformBar」という名前のプロジェクトを作成します。作成したら、作成されたプロジェクトのディレクトリに、先ほどビルドした2ファイルと、「<解凍したフォルダ>\」にある「BandObjects.snk」ファイルをコピーします。

 コピーの後、BandObjectLibを、参照設定に加えます。ソリューションエクスプローラの[参照設定]を右クリックし、[参照の追加]を選びます。[参照]ボタンを押して、プロジェクトの中にある「BandObjectsLib.dll」を選択して、追加します。

コントロールの配置

 次は、コントロールを配置します。例として、以下のように配置してみました(色などは自由で結構です)。

各コントロールのプロパティ設定
(Name)TextTextAlign
label1転送速度MiddleCenter
label2UpMiddleCenter
label3DownMiddleCenter
lblTransUP(Null)MiddleCenter
lblTransDOWN(Null)MiddleCenter

コードの記述

 以下のusing文を追加します。

using BandObjectLib;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;

 次に、GUIDを作成します。[ツール]→[GUIDの作成]で作成できます。記述場所は、

namespace czPerformBar

 のあとに追加します。

記述例
[Guid("4BED4CF4-038B-497b-AF65-D3F79E9056D9")]
注意:GUIDは一回決めたら変更不可
 GUIDは、その名前の通り、グローバルな一意のID(Global Unique IDentifier)です。作成したツールバーを「regasm」(.NET Framework Assembly Registration Utility)等で登録する際に用いられます。
 GUIDを変更すると、「regasm」で同じ名前で登録しても、全く別のコントロールとして登録されてしまいます。GUIDは、一度設定したら、絶対に変えないようにしましょう。

 GUIDを記述した下に、BandObjectsの動作を定義します。

記述例
[BandObject("czPerformBar", BandObjectStyle.Horizontal |
     BandObjectStyle.ExplorerToolbar)]

 BandObjectsの動作を定義する、BandObjectsStyleには、以下の定数が含まれています。

BandObjectsStyleの定数
定数説明
BandObjectStyle.Horizontal水平方向にツールバーを配置します。
BandObjectStyle.Vertical垂直方向にツールバーを配置します。
BandObjectStyle.ExplorerToolbarIE(エクスプローラ)のツールバーとして構成します。
BandObjectStyle.TaskbarToolbarタスクバーのツールバーとして構成します。

 次に、クラス名等を書き換えます。これを、

public class UserControl1 : System.Windows.Forms.UserControl
{
    (略)
}

 以下のように変更します。クラスの名前は何でもいいですが、BandObjectを継承させるようにしてください。

記述例
public class czperformbar : BandObject
{
    (略)
}

 同じく、関数も書き換えます。これを、

public UserControl1()
{
    (略)
}

 以下のように変更します。

記述例
public czperformbar()
{
    (略)
}

 いよいよ、コードを記述していきます。まず、クラスの部分から。

public class czperformbar :BandObject 
{

    //    スレッドの待機時間(ms)
    int intInterval = 500;

    //    使用するネットワークカードの名前
    string NICName = "Laneed LD-10_100AL PCI Fast Ethernet Adapter";

    //    上り通信速度
    PerformanceCounter TransUP =
        new PerformanceCounter("Network Interface",
            "Bytes Sent/sec","", ".");

    //    下り通信速度
    PerformanceCounter TransDOWN =
        new PerformanceCounter("Network Interface",
            "Bytes Received/sec","", "." );

(以下略)

 NICName の値には、使用するネットワークカードの名前を入れてください。パフォーマンスカウンタの一覧に入っている名前です。一般的には、デバイスマネージャ に表示されているカード名(アダプタ名)でいいかと思います。

 次に、PerformanceCounterです。PerformanceCounterは、指定されたパフォーマンスカウンタの値を取得します。上記の例で言うと、「Network Interface」は、カテゴリ名です。取得するパフォーマンスカウンタのカテゴリを指定します。カテゴリ名には他にも以下のようなものがあります。

  • Processer
  • TCP
  • Cache
  • ASP.NET

 「Bytes Send/sec」は、カウンタ名です。上記のカテゴリに含まれる、オブジェクト名です。たとえば、「Network Interface」カテゴリの場合、以下のようなものがあります。

  • Bytes Received/sec
  • Bytes Send/sec
  • Bytes Total/sec
  • Packets Received/sec
  • Packets Send/sec
  • Packets Total/sec

 3番目の引数の空文字「""」は、インスタンス名です。ここでは、取得するインスタンスを設定します。ここで NICName変数を直接指定してもいいですが、ここはあえて、別のところで指定します。

 「"."」は、コンピュータ名です。取得するコンピュータの名前を指定します。「"."」だと、自分のPCのパフォーマンスカウンタを取得するようになります。

 それでは、メインのコードを記述していきます。czperformbarクラスのコンストラクタのInitializeComponent() の後ろに以下のように記述してください。

//各パフォーマンスカウンタのオブジェクトに、
//インスタンス名としてネットワークカードの名前を割り当てます。
TransUP.InstanceName = NICName;
TransDOWN.InstanceName = NICName;

 また、データをリアルタイムに収集するため、スレッドを作成します。スレッドの本体関数から、作っていきましょう。クラス内に、新しい関数を作成します。「上り」の取得関数から。

private void trdgetNETSentBytePerSec()
{
    float TransUPVal;
    while(true)
    {
        // Get Transfer(UP)
        //パフォーマンスカウンタの値の取得
        TransUPVal = TransUP.NextValue();
        //KByteに変換するため、1024で割る
        TransUPVal = TransUPVal / 1024;

        // ラベルに表示
        lblTransUP.Text =
            TransUPVal.ToString("###0.00") + " KByte/sec";
        this.Refresh();
        System.Windows.Forms.Application.DoEvents();
        Thread.Sleep(intInterval);    // 時間待ち
    }
}

 次は「下り」です。

private void trdgetNETReceivedBytePerSec()
{
    float TransDOWNVal;
    while(true)
    {
        // Get Transfer(DOWN)
        //パフォーマンスカウンタの値の取得
        TransDOWNVal = TransDOWN.NextValue();
        //KByteに変換するため、1024で割る
        TransDOWNVal = TransDOWNVal / 1024;
        // ラベルに表示
        lblTransDOWN.Text =
            TransDOWNVal.ToString("###0.00") + " KByte/sec";
        this.Refresh();
        System.Windows.Forms.Application.DoEvents();
        Thread.Sleep(intInterval);    // 時間待ち
    }

}

 コード的には、ほとんど同じです。なんか、while (true) ってやってて怖いですが。

 次に、スレッドを動かすための記述です。先ほどの、

TransUP.InstanceName = NICName;
TransDOWN.InstanceName = NICName;

 の下に、以下のように記述します。

// 上り通信速度取得スレッド
Thread TranUPThread =
    new Thread((new ThreadStart(this.trdgetNETSentBytePerSec)));
TranUPThread.IsBackground=true;
TranUPThread.Start();

// 下り通信速度取得スレッド
Thread transDOWNThread =
    new Thread((new ThreadStart(this.trdgetNETReceivedBytePerSec)));
transDOWNThread.IsBackground=true;
transDOWNThread.Start();

 これでコードのほとんどはできました。次は、「Assembly.cs」の編集です。まず、アセンブリの署名をします。

[assembly: AssemblyKeyFile(@"..\..\BandObjects.snk")] 

 キーファイル「BandObjects.snk」を使用して厳密名(Strong Key)で署名します。ファイルのパスは、環境に応じて変更してください。アセンブリのバージョンも、明確に決めます。

[assembly: AssemblyVersion("1.0.0.0")]

 作成したツールバーをビルドする前に、先にBandObjectLibを「regasm」と「gacutil」で登録する必要があります。そうでないと動きません(先にBandObjectLibをソリューションごとビルドすれば自動的に登録されるはずです)。プロジェクトと同じ場所で、ビルドして出力されたファイルと一緒にBandObjectLibを登録しても大丈夫かと思います。

 ビルドします。ビルドエラーが出なければ、完成したも同然です。使用するには、作成したdllをアセンブリ等に登録してあげなければいけません。このためのプロジェクトも、作成しましょう。

 ソリューションに、新しいプロジェクトを追加します。[ファイル]→[新規作成]→[プロジェクト...]を選択し、ダイアログで、[プロジェクトの種類]から[Visual C++ プロジェクト]、[テンプレート]から[空のプロジェクト (.NET)]を選択します。

 追加したプロジェクトの構成プロパティの[全般]にある[構成の種類]を[ユーティリティ]にします。次に、今追加した「Register」プロジェクトのプロパティを開き、構成プロパティから、[ビルド イベント]→[ビルド後のイベント]を選択します。

 [コマンドライン]の[...]をクリックし、表示された入力欄に以下のように入力します。

cd $(ProjectDir)..\..\bin\debug
gacutil /if czPerformBar.dll
regasm czPerformBar.dll

 DLLのファイル名は、環境に応じて変えてください。「cd $(ProjectDir)..\..\bin\debug」の所は、各自、環境に応じてパスを変更してください。ビルド順序を、「czPerformBar」が先、「Register」が後になるように変更してください。

 これで、すべてビルド(ソリューションのビルド)して、IEをすべて閉じてIEを再起動。ツールバーの右クリックメニューに作成したツールバーが表示されていれば、完了です。動作としては、こんな感じになります。

VS 2005の場合
 VS 2005を使用する際は、ビルド後のイベントを実行する(cppの)プロジェクトは必要ありません。ビルド時のイベントは、現在開発中のプロジェクトの[プロパティ]→[ビルド イベント]で設定できます。
ビルドイベントの設定
ビルドイベントの設定
 なお上図は、VS 2005 Beta2の画面のため、製品版では変更される可能性があります。
 また、VS 2005では「AssemblyInfo.cs」などの編集が簡単になり、プロジェクトのプロパティ画面で編集できます。
 厳密名での署名は、プロジェクトのプロパティ中の[署名]タブで行います。
 また、アセンブリのタイトルやバージョンは、[アプリケーション]タブの[アセンブリ情報]で設定できます。
作成したツールバーをアンインストールするには?
 作成したツールバーをアンインストールするには、「gacutil」と「regasm」にて登録を解除する必要があります。解除するには、コマンドプロンプトから
gacutil /unregister "登録したファイル名"
regasm  /u "登録したファイル名"
 とする必要があります。
 なお、「gacutil」を使ってアンインストールするときは、ファイル名に拡張子は必要ありません。「regasm」のときは拡張子が必要です。
コンパイルが成功しリスト一覧にも表示されているのに、ツールバーが表示されない場合
  1. ツールバーが固定になっていませんか?
  2. ネットワークカード名が間違っていませんか?
  3. パフォーマンスカウンタが無効になっている可能性があります。
  4. MSKB:248993[PRB]パフォーマンスモニタにパフォーマンスオブジェクトが表示されないを参照して、パフォーマンスカウンタを有効にしてください。Windows 2000のパフォーマンスライブラリでは、誤った形式でデータを返すパフォーマンスDLL、 未処理のプログラム エラーを起こすパフォーマンスDLL、およびパフォーマンスデータを返す時間が長すぎるパフォーマンスDLL をすべて無効にします。
    ※イベントログにて、イベントID「1017」「1018」が発生すると、PerformanceCounter内のTcpipがエラーを起こしてカウント取得が不可になってしまうので、上記KBを参照して、無効になっているパフォーマンスカウンタを有効にしてください。

まとめ

 BandObjectsを使うと、.NETで簡単にツールバーを作成することができました。この記事を参考にして、オリジナルのツールバーを作ってみてはいかがでしょうか。

参考資料

  1. The Code Project 「Extending Explorer with Band Objects using .NET and Windows Forms」
  2. IE ToolbarをC#で作る
  3. DOBON.NET パフォーマンスカウンタから値を取得する
  4. MSKB:248993[PRB]パフォーマンス モニタにパフォーマンス オブジェクトが表示されない
  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2005/04/13 14:47 GUIDに関する注意を追加

  • 2005/04/12 22:52 リンク修正

著者プロフィール

  • Elfaria(エルファリア)

    VBerなニッチ系へたれプログラマ。 得意分野はツール・ユーティリティ系アプリ。 苦手分野はデータベース関連アプリ。 Tips of VB.NET 管理人 http://tipsofvb.net

All contents copyright © 2005-2019 Shoeisha Co., Ltd. All rights reserved. ver.1.5