Archive for July, 2009

LVIS_DROPHILITED?

HILIGHTED だろJK.

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が付いているとパースエラーになるのが落とし穴。

WM_GETDLGCODE無限ループ

IWebBrowserを乗っけたダイアログ上でTextFieldを含んだJavaAppletを開き、そのあたりをいじっているとメインスレッドがフリーズ。

なんだろうと思ってブレークをかけてみると、ダイアログの子要素に対してWM_GETDLGCODEがものすごい勢いで投げまくられている状態。

で、調査した。

WM_GETDLGCODEのなんたるか:

http://msdn.microsoft.com/ja-jp/library/ms645425

http://support.microsoft.com/kb/83302/en

タブコントロールを使っている場合に同じ状況に陥るケースが頻繁に報告されている。僕には関係ない。次。

http://blog.goo.ne.jp/satomi_takeo/e/b058ef705da6ca88ec87db660878c789

あたりっぽいんだが、リンク先サイトが死んでいて状況を追えず。次。

http://www.guyswithtowels.com/articles/2002-08-15-1600.html#ModelessDialogs

具体的なコードも出ていて助かる。が、メッセージポンプはMFC側にあるので、この通りに実装するの難しそう。