ちょっと余談で

ロジック中に

ipaddress = String((_TCHAR *)_bstr_t(inet_ntoa(*(struct in_addr *)&pIPAddrTable->table[num].dwAddr)));

のように、_bstr_tが多用されているのをみて、「何してるんだ」と思われている方も多いかもしれませんが、
これは使っているプログラムがVisualStudiの文字セットオプションで、「Unicode文字セットを使用する」を選択しても、「マルチバイト文字セットを使用する」を選択しても、文字列処理の動作を書き換えなくても良いようにと、怠慢をするために勝手につかっちゃっているものです。


本来であれば、

#ifdef  _UNICODE
    char *address = inet_ntoa(*(struct in_addr *)&pIPAddrTable->table[num].dwAddr);
    size_t count = mbstowcs(NULL, address, strlen(address));
    wchar_t *addr_str = (wchar_t*)calloc(count+1, sizeof(wchar_t));
    count = mbstowcs(addr_str, address, strlen(address));
    ipaddress = String(addr_str);
    free(addr_str);
#else
    ipaddress = String(inet_ntoa(*(struct in_addr *)&pIPAddrTable->table[num].dwAddr));
#endif  //  _UNICODE

こんな感じで文字セットを考慮したロジックにしたほうが良いんだと思うんだけど、Windowsでのロジックだからこれもありかなってつかっちゃってます。


ちなみに_bstr_tクラスですが、
http://msdn.microsoft.com/ja-jp/library/9k3ebasf.aspx
にあるように、"char *"も"wchar_t *"もどちらも入力できて、"char *"タイプの文字が入力されると内部で"wchar_t *"に変換してバッファに保存します。
また、
http://msdn.microsoft.com/ja-jp/library/btdzb8eb.aspx
にあるように、"char *"も"wchar_t *"もどちらも出力できて、"char *"タイプでの出力では、内部で保存している"wchar_t *"タイプの文字を"char *"タイプに変換した後に、そのバッファのポインターを返すように作られています。