FStringクラスの使用方法で
昨日公開したFStringクラスですが、説明文中で使用したサンプルのプログラムで冗長な部分があったので修正します。
/* * 指定したインターフェースに設定されたアドレスを取得する * param : インターフェースの番号(int) * * return : address_list */ address_list AddrInfo::setAddressList(int ifIndex) { address_list result; String ipaddress; String netmask; String bcastaddress; long retCode = NO_ERROR; DWORD dwSize = 0; GetIpAddrTable(NULL, &dwSize, 0); PMIB_IPADDRTABLE pIPAddrTable = (MIB_IPADDRTABLE *)malloc(dwSize); memset(pIPAddrTable, 0, dwSize); if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) == NO_ERROR) { for (unsigned int num = 0; num < pIPAddrTable->dwNumEntries; num++) { if (ifIndex == pIPAddrTable->table[num].dwIndex) { ここ==> ipaddress = String((_TCHAR *)FString(inet_ntoa(*(struct in_addr *)&pIPAddrTable->table[num].dwAddr))); ここ==> netmask = String((_TCHAR *)FString(inet_ntoa(*(struct in_addr *)&pIPAddrTable->table[num].dwMask))); bcastaddress = getBcastAddr(pIPAddrTable->table[num].dwAddr, pIPAddrTable->table[num].dwMask, pIPAddrTable->table[num].dwBCastAddr); AddrInfo info = AddrInfo(ipaddress, netmask, bcastaddress, pIPAddrTable->table[num].wType); result.push_back(info); } } } free(pIPAddrTable); return result; }
_bstr_tクラスをそのまま置換えちゃったので、
ipaddress = String((_TCHAR *)_bstr_t(inet_ntoa(*(struct in_addr *)&pIPAddrTable->table[num].dwAddr))); || V ipaddress = String((_TCHAR *)FString(inet_ntoa(*(struct in_addr *)&pIPAddrTable->table[num].dwAddr)));
と何やら複雑なキャストがされていますが、後から色々とチェックしていて、
ipaddress = (String)FString(inet_ntoa(*(struct in_addr *)&pIPAddrTable->table[num].dwAddr));
で良いことが分かりました。
_bstr_tクラスでは、"string"や"wstring"にキャストするオペレータがなく、キャストできるのが"char*"か"wchar_t*"になるために、String化する場合には、一旦_bstr_tを"char*"か"wchar_t*"にキャストしてStringを構成させる方法だったのですが、FStringでは直接"string"や"wstring"にキャストするオペレータを用意したので、(_TCHAR *)へのキャストとStringの作成が不要だったのでした。
実際には、ipaddressがStringクラスなのでキャストも不要ですが、一応明示的に付けてあります。