Archive for July 16th, 2009

MSXMLで文字列をインポートする方法

loadXMLを使うと encoding が期待通り処理されない。

以下のようにする。

VARIANT var;
{
SAFEARRAYBOUND	rgb={strlen(xml),0}; //末尾にNULL文字つけちゃだめ
SAFEARRAY* psa = SafeArrayCreate(VT_UI1,1, &rgb);
if(!psa){
assert(false);
return false;
}
char*	buf;
SafeArrayAccessData(psa,(void**)&buf);	// 作成したSAFEARRAYのポインタ取得及びロック
memcpy(buf,xml,strlen(xml)); // 末尾のNULL文字分のバッファは無い!
SafeArrayUnaccessData(psa);		// アンロック
var.vt=VT_ARRAY|VT_UI1;
var.parray=psa;
}
bool ret=manifest->load(var);
::SafeArrayDestroy(var.parray);
if(!ret){
::OutputDebugString(manifest->GetparseError()->Getreason());
::OutputDebugString(manifest->GetparseError()->GetsrcText());
return false;
}

末尾にNULLが付いているとパースエラーになるのが落とし穴。