HILIGHTED だろJK.
Archive for July, 2009
MSXMLで文字列をインポートする方法
16
Jul
loadXMLを使うと encoding が期待通り処理されない。
以下のようにする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
VARIANT var; { SAFEARRAYBOUND rgb={strlen(xml),<span class="synConstant">0</span>}; <span class="synComment">//末尾にNULL文字つけちゃだめ</span> SAFEARRAY* psa = SafeArrayCreate(VT_UI1,<span class="synConstant">1</span>, &rgb); <span class="synStatement">if</span>(!psa){ assert(<span class="synConstant">false</span>); <span class="synStatement">return</span> <span class="synConstant">false</span>; } <span class="synType">char</span>* buf; SafeArrayAccessData(psa,(<span class="synType">void</span>**)&buf); <span class="synComment">// 作成したSAFEARRAYのポインタ取得及びロック</span> memcpy(buf,xml,strlen(xml)); <span class="synComment">// 末尾のNULL文字分のバッファは無い!</span> SafeArrayUnaccessData(psa); <span class="synComment">// アンロック</span> var.vt=VT_ARRAY|VT_UI1; var.parray=psa; } <span class="synType">bool</span> ret=manifest->load(var); ::SafeArrayDestroy(var.parray); <span class="synStatement">if</span>(!ret){ ::OutputDebugString(manifest->GetparseError()->Getreason()); ::OutputDebugString(manifest->GetparseError()->GetsrcText()); <span class="synStatement">return</span> <span class="synConstant">false</span>; } |
末尾にNULLが付いているとパースエラーになるのが落とし穴。
WM_GETDLGCODE無限ループ
06
Jul
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側にあるので、この通りに実装するの難しそう。