雑記帳

ブログを使わずにArrangeNoteで作っている公開雑記帳

Apr 11, 2007 - UnplugDrive Portableの半透明ウィンドウ処理の問題解決

BITMAPINFOHEADER構造体で32bitビットマップを作るように変更したら、ICM32.DLLでアプリケーションエラーにならなくなったそうです。一安心。

Apr 11, 2007 - UnplugDrive Portableの半透明ウィンドウ処理の問題点

ただいまベクターの掲示板(ちょっと違うけど)で行っているUnplugDrive Portableのアプリケーションエラーの調査についてですが、 ユーザ様のご協力のおかげで、だいたい問題の原因を特定できました。(マイケル様のご協力に深く感謝します)

UnplugDrive Portableの半透明ウィンドウは、アルファチャンネル付きの32bitビットマップオブジェクトをCreateDIBSection() APIで作ります。

Platform SDKによれば、CreateDIBSectionには本来BITMAPINFO構造体を渡すのですが、 アルファ値を明示するためにBITMAPINFOHEADERの代わりにBITMAPV4HEADERを使って 半透明ビットマップを作っていました。

が、これがどうもダメらしく、Winampの掲示板でも「working around an OS bug that was causing CreateDIBSection to sometimes crash (divide-by-zero in ICM32) using V4 bitmap header struct」と、UnplugDrive Portableと同じ現象のbug fixが報告されていました。

じゃ、Platform SDKに記載されているように厳密にBITMAPINFO構造体(BITMAPINFOHEADER構造体)を指定しなければならないのか、 というと、そうでもないようで、Microsoft自身 http://support.microsoft.com/kb/318876/ja の中でBITMAPV5HEADERでCreateDIBSectionを呼び出している例を明示しています。

とりあえず、BITMAPINFOHEADER構造体で32bitビットマップを作るように変更してみましたが、果たしてこれで問題解決するかどうか、結果待ちです。

記事の一覧

Copyright © 2007 Koichi Yamamoto