文字化け

色々と調べていくと、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;
}

この変更で、JavaC++の両方で問題なくデータを取得表示できました。