- PR -

MFC DLLが持つダイアログで、アニメーションを表示させる方法

1
投稿者投稿内容
gt-f
会議室デビュー日: 2006/10/05
投稿数: 18
投稿日時: 2008-11-28 02:28
【環境】
WindowsXP(sp2)、VC++2005(MFC)


【やりたいこと】
重たい処理(MFC DLLで動作)をワーカースレッドにて動作させている間、
同じMFC DLLが持つダイアログをDomodalで表示させ、そのダイアログ上
にアニメーションを表示させる。

MFC DLLは、プロジェクト作成時、MFCをスタティックにリンクさせる
ものを選択しています。

具体的には以下の【やったこと】のいずれかの案で実現させたいと思っております。
なお、画像(映像)はリソースから読み込むことが前提となります。


【やったこと】
MFCの"exe"が持つダイアログで、以下3つの方法で動作することを確認しました。

1.ピクチャコントロールを使う。
 リソースのビットマップをループの中で入れ替えて、アニメーションのように
 表示させる。CImage::LoadFromResourceを使う。
 ※ #include <atlimage.h>が必要

2.Microsoft Web Browserを使う。
 アニメーションには、アニメーションgifを用いる。
 コンポーネント名.Navigate("gifアニメ") で再生。
  → リソースにアニメーションgifをインポートできないので没かも

3.アニメーションコントロールを使う。
 フリーソフトを使って、ビットマップからaviファイルを作成し、
 リソースにインポート。CAnimateCtrl::open()、Play()で再生。


【お聞きしたいこと】
同じことをMFC DLLが持つダイアログで実現しようとすると、ビルドは
通るものの、実行時に「debug assertion failed!」のダイアログが
出てしまいます。

案1に関しては、LoadFromResource()ではなく、
CImage::Load("ビットマップのフルパス") ではうまくいくことを確認しまし
たが、Loadではリソースから読み込めないため、根本的解決になっておりません。

「debug assertion failed!」が出てしまうのは、何が原因なのでしょうか。
参考になるURL等でも構いませんので、ご教示の程、よろしくお願いいたします。


※職場からは、@IT会議室がフィルターにひっかかってしまい、書き込みが
 できないため(閲覧は可能)、自宅から思い出しながら書いております。
 表現が抽象的で申し訳ございません。


[ メッセージ編集済み 編集者: gt-f 編集日時 2008-11-28 18:54 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2008-11-28 07:04
引用:

同じことをMFC DLLが持つダイアログで実現しようとすると、ビルドは
通るものの、実行時に「debug assertion failed!」のダイアログが
出てしまいます。



"Debug Assertion" の意味分かってます?

ありきたりなメモリ保護違反とかではなくて、おそらくは MFC の中の ASSERT() マクロに引っ掛かってます。

そして、ASSERT() マクロならデバッガで原因箇所のソースが見れるはずです。

おまけに MFC なら、親切なことに ASSERT() の周囲にヒントになるコメントが書かれていることも多々あります。

引用:

「debug assertion failed!」が出てしまうのは、何が原因なのでしょうか。



「DLL でリソースを扱う」場合にありがちなパターンとしては、AFX_MANAGE_STATE マクロの使用忘れが考えられます。
gt-f
会議室デビュー日: 2006/10/05
投稿数: 18
投稿日時: 2008-11-28 18:53
渋木宏明(ひどり)様

返信どうもありがとうございます。

引用:

"Debug Assertion" の意味分かってます?



「これが出たらまずい」位の認識でした。
お陰様で、デバッガにて原因箇所を確認することができました。

引用:

「DLL でリソースを扱う」場合にありがちなパターンとしては、
AFX_MANAGE_STATE マクロの使用忘れが考えられます。



まさにビンゴでした。恥ずかしながら一部見落としておりました。

EndDialogの記述箇所を変えたら、急に"Debug Assertion"が出始めたので、
ワーカースレッドとの同期の問題だと思い込んでいました。

リソースを扱う全メソッドの先頭に、
 AFX_MANAGE_STATE( AfxGetStaticModuleState() ) ;
を追加することで、
CImage::LoadFromResource() にて実装することができました。

本当にどうもありがとうございました。
風になる
ベテラン
会議室デビュー日: 2008/07/28
投稿数: 85
投稿日時: 2008-12-06 11:44
(利用規約違反のため削除いたしました。@ITクラブメンバーシップセンター)
1

スキルアップ/キャリアアップ(JOB@IT)