< January 2006 | February 2006 | March 2006 >

February 24, 2006

ローカルネットワークを選択するコンボボックス

TCP サーバや UDP アプリなどの設定画面に登場する、バインドするネットワークアドレスを選択するコンボボックスです。はい、ものすごく限定的な Tips です。ネットワークインターフェースの列挙方法の一例、かな?

BOOL CXXXDialog::InitNetworkCombo (void)
{
    char szHostName [MAX_PATH];
    ZeroMemory (szHostName, sizeof szHostName);
    m_ComboNetwork.Clear ();
    
    // このコンピュータのホスト名を取得する
    int nRet = gethostname (szHostName, sizeof szHostName);
    if (SOCKET_ERROR == nRet)
    {
        // エラー処理
    }
    else
    {
        // ホスト名よりホストの情報を取得する
        struct hostent* pHostEnt = gethostbyname (szHostName);
        if (!pHostEnt)
        {
            // エラー処理
        }
        else
        {
            // INADDR_ANY を追加する
            int nIndex = m_ComboNetwork.AddString (_T ("すべてのネットワーク"));
            m_ComboNetwork.SetItemData (nIndex, INADDR_ANY);
            
            // 取得したアドレスのリストをコンボボックスに追加する
            for (int nCount = 0; pHostEnt->h_addr_list [nCount]; nCount ++)
            {
                struct in_addr Address;
                memcpy (&Address, pHostEnt->h_addr_list [nCount], sizeof (struct in_addr));
                nIndex = m_ComboNetwork.AddString (inet_ntoa (Address));
                m_ComboNetwork.SetItemData (nIndex, Address.S_un.S_addr);
            }
            
            // ループバックを追加する
            nIndex = m_ComboNetwork.AddString (_T ("127.0.0.1"));
            m_ComboNetwork.SetItemData (nIndex, INADDR_LOOPBACK);
            return TRUE;
        }
    }
    return FALSE;
}

February 7, 2006

しょぼ Hash クラス

低機能な連想配列クラスです。お仕事プログラムで、キーと値を対にして格納するようなファイルを読み込む際に、値をパースする関数のポインタを格納するためにさらさらっと書いたものなので、動作確認は十分にしていません。キーや値の列挙等はサポートしていません。(そのうち気が向いたらつけるかもしれませんが)キーは文字列、しかも TCHAR [] のみの対応です。よく言えばシンプルで、メモリの消費量も小さいので、固定のディクショナリとしてなら使い道があるかもしれません。

CLightHash <int, -1> IntHash;
IntHash.Add ("abcde", 5);
IntHash.Add ("abc", 7);
IntHash.Add ("ac", 6);
int nRet;
nRet = IntHash.Explore ("abcde");
nRet = IntHash.Explore ("abcdef");
nRet = IntHash.Explore ("abc");
nRet = IntHash.Explore ("ac");
nRet = IntHash.Explore ("");

nRet = IntHash ["abcde"];
nRet = IntHash ["abcdef"];
nRet = IntHash ["abc"];
nRet = IntHash ["ac"];
nRet = IntHash [""];
IntHash ["123"] = 123;
nRet = IntHash ["123"];

# イマイチ汎用性に欠けているとはいえ、こういう流用可能なクラスを一所懸命作っているあたり、仕事がいまひとつ調子が出てないのがバレバレですな・・・。
# 調子がよければこんなの作ってませんとも 笑。

続きを読む...