2009/10/19(月) 08:49:25の文章は間違えて書き込み途中に送信してしまいました。
申し訳ありません。
もしかしたら本当にバグかもしれません。
ググったらこんなページを見つけました。
http://www.tech-archive.net/Archive/Development/microsoft.public.win32.programmer.gdi/2007-01/msg00033.html
第二引数のファイル名のポインタ値の下位16ビットが
たまたま winuser.h に定義されている OBM_* の値に一致するときに現象が発生します。
回避するには第一引数にインスタンスハンドルを渡せばいいようです。
subaruさんご紹介ありがとうございます。
紹介頂いたサイトを参考に不具合時のLoadImage内部を混合モードで
追っかけてみました。
おそらくですが関数引き渡し時にスタックに書き込まれたfnのアドレスが
LoadImage処理中に別のアドレスに書き換わっていました。
(正常時には書き換わっていませんでしたのでおそらく間違いないと思われます)
結果として指定したファイルと異なるデータが帰ってきたようです。
とりあえずの対策として
1.fnをstaticとしスタックを使用しない
2.第一引数にインスタンスハンドルを渡す
この2点で様子を見ることとしました。
混合モードで見ていたため実際は他スレッドの処理だったのかもしれませんが
確認方法が解らず不明です。
時間が立ってしまいましたが結果を書き込みます。
対策として
1.fnをstaticとしスタックを使用しない
2.第一引数にインスタンスハンドルを渡す
を行いましたが
1.のみでは現象が再発、1週間ぐらいで再度発生しました。
2.を追加で実施した所、1ヶ月連続動作させましたが発生しませんでした。
はっきりとした原因はわかっていませんので、これで100%解決したとは
言えませんが一応結果として報告し、解決とします。
みなさまありがとうございました。