文字化け
色々と調べていくと、Javaでの表示とC++での表示で文字表示が一致していないのは、内部的なロケールの処理の問題でした。
IfInfo.cppの中のgetInterfaceList()メソッドとloadInterfaceInfo(IfInfo& if_table)を書き換えて
/* * システムで利用可能なインターフェースの一覧を取得する * param : 無し * * return : interface_list */ interface_list IfInfo::getInterfaceList() { interface_list if_list; long retCode = NO_ERROR; DWORD dwSize = 0; GetIfTable(NULL, &dwSize, true); PMIB_IFTABLE pIfTable = (MIB_IFTABLE *)malloc(dwSize); memset(pIfTable, 0, dwSize); retCode = GetIfTable(pIfTable, &dwSize, true); if (retCode == NO_ERROR) { for (u_int i = 0; i < pIfTable->dwNumEntries; i++) { IfInfo if_table = IfInfo(); MIB_IFROW pInterface = pIfTable->table[i]; if_table.ifIndex = pInterface.dwIndex; if_table.ifName = if_table.description = String((_TCHAR *)_bstr_t((char *)pInterface.bDescr)); if_table.ifType = pInterface.dwType; if_table.opStatus = pInterface.dwOperStatus; if_list.push_back(if_table); } } free(pIfTable); return if_list; } /* * インターフェースの詳細情報を設定する * param : インターフェーステーブル(IfInfoポインター) * * return : 無し */ void IfInfo::loadInterfaceInfo(IfInfo& if_table) { DWORD dwSize = 0; long retCode = NO_ERROR; if (GetAdaptersInfo(NULL, &dwSize) == ERROR_BUFFER_OVERFLOW) { PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *)malloc(dwSize); memset(pAdapterInfo, 0, dwSize); retCode = GetAdaptersInfo(pAdapterInfo, &dwSize); if (retCode == NO_ERROR) { PIP_ADAPTER_INFO pAdapter = pAdapterInfo; while (pAdapter) { if (pAdapter->Index == if_table.ifIndex) { if_table.adapterName = String((_TCHAR *)_bstr_t(pAdapter->AdapterName)); if_table.ifAddress = getMacAddress(pAdapter->Address, pAdapter->AddressLength); if_table.ipAddressList = AddrInfo::setAddressList(if_table.ifIndex); if_table.dhcpEnabled = pAdapter->DhcpEnabled ? true : false; HKEY hkey = NULL; _bstr_t adapter = _bstr_t(_T("SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\")); adapter += _bstr_t((char *)pAdapter->AdapterName); adapter += _bstr_t(_T("\\Connection")); int rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (_TCHAR *)adapter, 0, KEY_READ, &hkey); if (rc == ERROR_SUCCESS) { DWORD valueType = 0; DWORD nameLen = 0; rc = RegQueryValueEx(hkey, _T("Name"), 0, &valueType, NULL, &nameLen); _TCHAR *buff = (_TCHAR *)calloc(nameLen+1, sizeof(char)); rc = RegQueryValueEx(hkey, _T("Name"), 0, &valueType, (LPBYTE)buff, &nameLen); if_table.ifName = String(buff); RegCloseKey(hkey); free(buff); } } pAdapter = pAdapter->Next; } free(pAdapterInfo); } } }
テストプログラムのメインの部分にロケールを設定する行を追加しました。
int _tmain(int argc, _TCHAR* argv[]) { COUT.imbue(locale("japanese")); getAddress(); getInterface(); key_wait(); return 0; }