文字化け・・・WMIも修正

文字コードの問題が理解できたので、始めに作ったwmiも作り直してみました。


wmi.cppのgetString(VARIANT *value)メソッドでVT_BSTRを別ロジックにしていたのを、VT_BOOL以外同じロジックに集約しました。

/*
 *  VARIANTデータを文字列値に変換し取得する
 *  param   : データ(VARIANTポインター)
 *
 *  return  : String
 */
String WmiResult::getString(VARIANT *value) {
    String result;
    if (value != NULL) {
        if (isArray(value)) {
            string_vector list = getStringArray(value);
            if (!list.empty())
                result = list.at(0);
        }
        else {
            if (getType(value) == VT_BOOL) {
                BSTR bool_str;
                /*
                 *  VT_BOOL型のデータをVT_BSTR型のデータに変換
                 *  return  : S_OK = 正常に変換できた(ここでは結果はチェックしない)
                 *            その他 = エラー
                 *  参照:http://msdn.microsoft.com/en-us/library/ms221338.aspx
                 */
                VarBstrFromBool(((isByRef(value)) ? *value->pboolVal : value->boolVal), 0, LOCALE_NOUSEROVERRIDE, &bool_str);
                result.append(_bstr_t(bool_str));
            }
            else {
                result.append((_TCHAR *)_bstr_t(*value));
            }
        }
    }
    return result;
}

これに会わせて、JNIのjniwmiのload_classを以下のように修正しました。

/*
 *  WmiCallからの結果をJavaのクラスに展開する処理
 */
jobject load_class(JNIEnv *env, WmiResult results) {
    /*
     *  WmiResultオブジェクトの生成
     */
    jobject wmiObj = env->NewObject(wr_class, wr_ctor);

    /*
     *  プロパティ値の設定
     */
    size_t prop_count = results.items();
    jobjectArray properties = env->NewObjectArray((jsize)prop_count, str_class, NULL);
    for (size_t i = 0; i < prop_count; i++) {
        _bstr_t prop = _bstr_t((_TCHAR *)results.getProperty(i).c_str());
        jobject prop_str = env->NewString((const jchar *)((wchar_t *)prop), (jsize)prop.length());
        env->SetObjectArrayElement(properties, (jsize)i, prop_str);
    }
    env->SetObjectField(wmiObj, wr_propertiesID, properties);

    /*
     *  戻り値の設定
     */
    size_t row = results.size();
    jobjectArray result = env->NewObjectArray((jsize)row, vector_class, NULL);
    for (size_t i = 0; i < row; i++) {
        jobject vector = env->NewObject(vector_class, vector_init);
        for (size_t j = 0; j < prop_count; j++) {
            String prop = results.getProperty(j);
            String entry_value = results.getString(prop, i);
            _bstr_t entry = _bstr_t((_TCHAR *)entry_value.c_str());
            jobject entry_str = env->NewString((const jchar *)((wchar_t *)entry), (jsize)entry.length());
            jboolean res = env->CallBooleanMethod(vector, vector_add, entry_str);
        }
        env->SetObjectArrayElement(result, (jsize)i, vector);
    }
    env->SetObjectField(wmiObj, wr_resultID, result);
    return wmiObj;
}

これで少しは綺麗なロジックになったかな。