GDI+のDrawImageでGIF画像の描画を行うと、
「例外処理 (初回) は HOGE.exe (GDIPLUS.DLL) にあります: 0xC0000005: Access
Violation」
というメッセージが発生します。
Debug/Release共に、描画は正常にできていて強制終了することはありませんが
メッセージがでないようにしたいと思っています。
BMP/JPEG/TIFFでは上記のようなメッセージはでずに描画されます。
GDI+の不具合でしょうか?
なにかご存知の方、いらっしゃいますでしょうか?
描画のソースです->
Bitmap* pImage;
Graphics cGraphics(dc.m_hDC);
//画像ファイル読み込み
pImage = Bitmap::FromFile(Lファイルパス,TRUE);
//アンチエイリアス有効化
cGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
//画像表示
cGraphics.DrawImage(pImage,
rect.left - rectWindow.left,
rect.top - rectWindow.top,
rect.Width(),
rect.Height());
環境:VisualStadio6.0 MFC使用
すいません、途中で投稿してしまいました。
Bitmap* pImage;
Graphics cGraphics(dc.m_hDC);
//画像ファイル読み込み
pImage = Bitmap::FromFile(Lファイルパス,TRUE);
//アンチエイリアス有効化
cGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
//画像表示
cGraphics.DrawImage(pImage,
0,
0,
rect.Width(),
rect.Height());
うーん。
動いているから自分のプログラムの不具合では無いと言う判断は
適切では無いと思いますよ。
むしろ一見ちゃんと動いているように見えて裏ではメモリを壊してるとか
そういう不具合の方がよっぽど性質が悪いです。
容易には見つからないので、リリース後に発覚して青くなるなんて事も
ありますし。
場合によっては殆どアクロバットと行っても良いような綱渡りで
一見うまく動いているように見えている事もありますよ。(>_<)
例外と言うからには想定外の状況が起きていると言う事ですから
ちゃんと原因を究明して本当に影響の無い例外なのかを突き止めるべきです。
それがはっきりするまではアプリケーションその物がグレーと言う事になります。
PATIO様、ありがとうございます。
>例外と言うからには想定外の状況が起きていると言う事ですから
>ちゃんと原因を究明して本当に影響の無い例外なのかを突き止めるべきです。
原因を突き止めたいのですが、情報がなくて...
なんとか以下のサイトを発見しました。
https://connect.microsoft.com/VisualStudioJapan/feedback/ViewFeedback.aspx?
FeedbackID=364417
VC2008でも同じような現状が報告されていますが、フィードバックされていません。
どんな情報でも良いのでお持ちの方いらっしゃいましたらお願い致します。
現状で何とか探ろうと思ったらコードを少しずつ削って
例外が出なくなるところまで頑張ってみるとかしか
思いつかないです。
例外が出ているのがGDIPLUSの部分なら
削ってみる部分もGDIPLUSの部分に絞り込めそうです。
コンパイルが通るように辻褄を合わせながら
コードをコメントアウトして行く事になるので
面倒ですけれど、仕方が有りません。
他にもっと簡単な方法があれば良いのですけれど。
> 原因を突き止めたいのですが、情報がなくて...
> なんとか以下のサイトを発見しました。
> VC2008でも同じような現状が報告されていますが、フィードバックされていません。
フィードバックされるのを待つのも一つの手ですね。
フリーソフト等でGIF→JPEG変換のツールなんかでてますから
JPEGに変換してアプリを動かす。
のも一つの手ですね。
ただ、PATIOさんの意見どおり、
「なら、GIF以外にすればすべてうまくいくのか?」
ということをきちんと調べておかないとまずいと思います。
どこかに落とし穴がないか一つ一つ調べてみる必要があると思います。
ありがとうございます。
JPEGにすることも考えてみます。
解決とさせて頂きます。
> JPEGにすることも考えてみます。
> 解決とさせて頂きます。
解決ですか?
本当にJPEGで大丈夫ですか?
PATIOさんの意見も読んで、一つ一つデバッグしてみて下さい。
「バグは解消し、問題が解決した」
ではなく
今後どう対策していくのか(JPEGにすればすむのか、フィードバックを待つか…etc)
わからないので、とりあえずこの質問スレッドを閉じるために
解決ボタンを押しました
って意味じゃないのな?
技術的な解決じゃないといやだって質問もあれば、
問題は回避できればいい、それよりも作りたいアプリケーションの完成が第一希望
って質問もあると思う
> 技術的な解決じゃないといやだって質問もあれば、
> 問題は回避できればいい、それよりも作りたいアプリケーションの完成が第一希望
> って質問もあると思う
了解です。
そうですね、様子を見ます。
>今後どう対策していくのか(JPEGにすればすむのか、フィードバックを待つか…etc)
>わからないので、とりあえずこの質問スレッドを閉じるために
>解決ボタンを押しました
おっしゃるとおりです。
後は自分でなんとかするしかなさそうでしたので
解決とさせて頂きました。
ありがとうございました。
>なんとか以下のサイトを発見しました。
> https://connect.microsoft.com/VisualStudioJapan/feedback/ViewFeedback.aspx?
>FeedbackID=364417
>VC2008でも同じような現状が報告されていますが、フィードバックされていません。
回答ではありませんが私の環境でも以下の手順で症状を確認できました。
1.スタートメニューからペイントを起動する。
2.VC++で「ツール」→「プロセスにアタッチ」を選択する。
3.mspaint.exeにアタッチする。
4.ペイントの「ファイル」→「開く」でGIFファイルを開く。
#Windows Vista SP1+Visual C++ 2008 Express Editionで確認
この手順でGIFファイルを開くたびに、リンク先と同様の例外メッセージが
デバッグペインに出力されます。
仕様なのか不具合なのかわかりませんが
OS標準のツールでも確認できるくらいだから
技術的にどうこうで解決する問題じゃないでしょうね。
なるほど、subaruさんのRESでようやく意味が分かりました。
デバッグウィンドウに[例外処理]のメッセージがでているだけ
と言うことですね。
それなら無視してもいい気がします。
例外処理をしたのに異常終了しないということは、
GDI+の中で try...catch してるということであり、
その結果、問題なしと判断したから、事後の処理を続行させて
いるのでしょう。
仕様とみなしてよいと思います。
(例) 以下のコードで、C:\1.txtが書き込み禁止だとすると、
TRY...CATCH がないと異常終了します
TRY
{
CFileStatus Status;
CFile::GetStatus(_T(C:\\1.txt), Status);
:
CFile::SetStatus(_T(C:\\1.txt), Status);
} CATCH(CFileException, e) {
} END_CATCH;
しかし、そのことを承知した上で、書き込み禁止でなければ、
Statusを書き換えたいということなら、上記のコードでいいわけです。
そして、その場合、正常系であっても、例外が発生することは
避けられないわけです。
subaru様、bun様、ありがとうございます。
メッセージだけで、強制終了等の問題が
ないようでしたら、このままでいこうと思います。