KDWにFindActCtxSectionStringWを実装すると IEが落ちる件
IME2003 や IME2007 IME2010などを組み込んでいると、KDW に関数 FindActCtxSectionStringW を実装した時に、IEがクラッシュしてしまう現象が以前から発生していました。
そのため、KDWにはこの関数を実装しないようにしていたのですが、その原因についてまとめてみました。
クラッシュする原因は。
msvct80.dll
msvct90.dll
msvct100.dll
この関数が GetProcAddress で FindActCtxSectionStringW をチェックし、関数がない場合は、成功 0 を返します。
関数が存在した場合はマニフェストファイルのチェックを行うために FindActCtxSectionStringW 関数を実行し、 関数が成功した場合は、そのまま続行、失敗したら、Runtimeエラーでクラッシュします。
さらに、
Microsoft.VC80.CRT.manifest
Microsoft.VC90.CRT.manifest
Microsoft.VC100.CRT.manifest
をアプリケーションフォルダから検索します。
あればこれに従って、WinSxS からDLLがロードされていることを確認し、なければやはりクラッシュしてしまいます。
実装方法としては、msvcr*.dllの FindActCtxSectionStringW を直接編集した上で、KDWに実装するかたちになるか、.manifestファイルを強制的に配置してもらうという実装かのどちらかになります。
なお。内部で、pgort80.dll、pgort90.dll、pgort100.dll などが動的にロードされている場合は、成功になるようなのですが、今度はアプリケーションの動作に問題が出てくるのでよくないようです。
試しに、XPで system32に msvcr*.dllをおいて同じことやったらエラーでクラッシュしました。
多分、セキュリティのために、ブロックする機構なんでしょうね。
Comments