文字化け・・・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; }
これで少しは綺麗なロジックになったかな。