ホーム | アプリケーション | Tips | ダウンロード | プログラム | コラム

CBアプリ工房


アプリケーション > ダイヤルアップ接続管理ツールを作る [ 1 | 2 ]

ダイヤルアップ接続管理ツールを作る - 1/2

更新 : 2009/01/04

 



実行中のダイアルアップ接続ソフト 完成図:ダイヤルアップ接続ソフト

ここではダイヤルアップ接続(※1)管理ツールの作成について解説します。
ダイヤルアップ接続管理ツールとは、インターネット接続時に通信時間を記録して、切断のタイミングや料金をコントロールするのに役立てるというものです。

Windows が提供するインターネットの接続時間は [接続] ダイアログで接続ボタンをクリックすると表示されるようになりますが、これはインターネットに接続されている時間なので、月々の通信時間およびかかった料金は分りません。ちなみに私の家では、
ダイヤルアップ接続を利用していた時(現在は ADSL 接続)、インターネットに接続するまでに 40〜50 秒の通信時間が経過(ダイアログに "ダイヤル中" が表示されているときは、既に通信料の課金が始まっている)していました。

この時間を累計していかないと、支払いの金額がおやっと思うほど多い場合があります。思い当たる人も多いのではないでしょうか。ということで通信時間を表示するツールを作ろうと言うわけです。作成には、スタンドアローンでモデム接続という一般的なパソコン環境を想定しています。

(※1)最近では ADSL の普及で、ダイヤルアップ接続を利用する人も激減していると思います(少し前に 30% は使用とする記事も見かけましたが……)。しかし ADSL が使えるようになったとは言え、私の地域のように二つのプロバイダが対応しているだけで、通信速度も自由に選べない、などの場合もあるはずです。そうしたことを考えるとダイヤルアップ接続の需要はまだあるのかもしれません。解説のタイミングとしては、ちょっと遅かった、という感じも否めませんが、インターネット関連ソフトの参考例と言うことでご覧ください。

ダイヤルアップ接続管理ツール作成のポイント
今回は、Win32API の RasEnumConnections 関数を利用します。この関数でダイヤルアップ接続のタイミングを監視して時刻を記録していきます。

具体的には、このソフトを実行してから IE を起動後、[接続] ダイアログから接続して通信の開始時刻を取得します。切断の場合は、[接続] ダイアログから切断して終了時刻を取得します。これで通信に要した時間がわかります。アプリとしては常駐ソフト的な動きですが、実際に使うには例によって、もろもろ修正する必要があります(後述)。

テクニック的には特に難しいところはありませんので、早速作ってみることにしましょう。



まず新規にアプリケーションを作成して、コンポーネントを以下のように配置します。Form のサイズは適当で良いです。

ダイヤルアップ接続解説
コンポーネント Name 説明
TLabel Label1 Caption を "通信開始時刻:" にします。
TLabel Label2 Caption を "通信時間" にします。
TLabel StartLabel 通信の開始時刻を表示させます。
TLabel MsgLabel ダイヤルアップ接続の状態をメッセージ表示させます。
TEdit PassEdit 通信時間が表示するようにします。
TBitBtn CloseBitBtn Kind を bkClose に設定します。
TTimer Timer1 通信時間をカウントするのに使います

コンポーネントの配置が済んだら、ヘッダーファイル Unit1.h のコーディングを行います。

ダイヤルアップ接続の状態を判定するためのフラグと、時刻の取得及び計算で使用する変数を宣言します。ダイヤルアップ接続の監視をするメンバ関数も宣言しておきます。


private:	// ユーザー宣言
    //ダイヤルアップ接続の状態:true(接続中), false(未接続)
    bool connected;
    TDateTime t, starttime, nowtime;

    bool __fastcall CheckDialup();//ダイヤルアップ接続を監視 

次に実際のコードを Unit1.cpp に書いていきます。

まず今回のメイン関数、CheckDialup をインプリメントします。この関数は、ダイヤルアップ接続の状態をチェックして、接続していれば true、未接続なら false を返します。動きを見ていきましょう。

最初に RasEnumConnections 関数ですべてのアクティブなリモートアクセス接続のリストを調べます。ダイヤル中あるいは接続されているものがあれば、バッファに接続数が入ってきます。接続数が 0 でなく、connected フラグが false であれば時刻(通信開始時刻)を取得します。すぐにフラグを true (接続中)に変更して関数を抜けます。

切断された場合は、ダイヤル中あるいは接続されているものがなくなるので、フラグを false にして関数終了です。なお、RasEnumConnections 関数の詳細については WIN32SDK のヘルプを参照してください。


//----------------------------------------------------------
//
// 機能 :ダイヤルアップ接続の状態をチェックする
//  戻り値:接続していればtrue、未接続ならfalseを返す
//
//----------------------------------------------------------
bool __fastcall TForm1::CheckDialup()
{
    RASCONN rasconn;  //状態を調べるRAS接続のハンドル
    DWORD buf;        //バイト単位でのバッファサイズ
    DWORD connections;//バッファに書き込まれる接続の数

    //RasEnumConnectionsを呼びだす前にdwSizeの設定が必要
    rasconn.dwSize = sizeof(RASCONN);
    //RASCONN構造体のバイト数
    buf = sizeof(RASCONN);

    //すべてのアクティブなリモートアクセス接続のリスト
    if(RasEnumConnections(&rasconn, &buf, &connections) == 0){
        //モデムがダイヤル中あるいは接続されている場合
        //(接続数が1以上)
        if(connections > 0){
            //接続していれば処理しない
            if(connected) return true; 

            //接続フラグをチェック
            if(!connected){
                //接続時の時刻を保持
                starttime = t.CurrentTime();
                Application->ProcessMessages();
                connected = true;//フラグ変更
                return true;
            }
        }else
            connected = false;//ダイヤルアップ未接続
    }

    return false;
}

続く・・・。



[ ホーム | ページトップ | 次へ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.