• 締切
  • 暇なときにでも

MFC オリジナルDLLからエクスポートしたビュークラスを CMultiDocTemplate で登録すると Assert Failed! が出る

  • 質問No.2288322
  • 閲覧数796
  • ありがとう数1
  • 回答数2

お礼率 40% (2/5)

環境はVisualStudio2005、MDIプロジェクトと拡張DLLプロジェクトを1つのソリューションに作成しています。

MDIアプリを作成していますが InitInstance() 関数内の
CMultiDocTemplateの引数 RUNTIME_CLASS() 実行時にAssert Failed!が出ます。
CMultiDocTemplate に登録するビュークラスはオリジナルの拡張DLL内でCFormViewクラスから派生させたクラスです。

特に変わったことをしている訳ではなく、ほとんどウィザードがソースを吐いた状態のままです。
"COriginalView" をデフォルトの "CMyView" にするとエラーは出ません。
また、"COriginalView" もコントロールを1ヶ置いてビューフォームとクラスを作成し、
AFX_EXT_CLASS でエクスポートして参照できています。
また、MDI側でフォームとクラスを作成しそれを使用した場合はエラーは出ません。

ドキュメント/ビューアーキテクチャの理解が足りない為起きている問題だと思います。
宜しくお願い致します。

--- 詳細 ------------------------------------------------

CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,
  RUNTIME_CLASS(CMyDoc),
  RUNTIME_CLASS(CChildFrame),
  RUNTIME_CLASS(CDllView)); ←これ実行時に Assert が出る
AddDocTemplate(pDocTemplate);

---------------------------------------------------------

回答 (全2件)

  • 回答No.2

ベストアンサー率 58% (21/36)

"COriginalView" が何なのか判りませんが、要はDLL側にあるビューで CMultiDocTemplate が成功しないと言う事でしょうか。

VisualStudio2005 が手元に無いのですが、MDI側のどこかに CRuntimeClass* p = RUNTIME_CLASS(CDllView);
を書いても失敗するのでしょう。

どうすれば解決するか判りませんが、MDI側で CDllView の派生クラスは作成できませんか?
補足コメント
sakuzo3

お礼率 40% (2/5)

コメント頂きありがとうございます。

COriginalViewはDLL側で作成したビュークラスです。
(テンプレートとなるダイアログを作成しウィザードを使用してクラスを作成しました)。

CRuntimeClass* p = RUNTIME_CLASS(COriginalView); は実行できました(エラー無し)。
また、MDI側でCOriginalViewの派生を作成しそれを用いても状況は変わらずです。。。

ちなみにドキュメントクラスですが、MDI側で作成したクラス(もちろん動作可能)をDLL側へ移したものを使用しています。
投稿日時:2006/07/24 16:11
  • 回答No.1

ベストアンサー率 53% (26/49)

MFC はもう何年も使ってないので、マトモな回答はできませんが…

どのファイルのどこの行で ASSERT しているかがメッセージとして表示されると思うので、これを追いかければ原因が分かると思います。
Visual C++ には MFC のソースが付いてきますし、CMultiDocTemplate のコンストラクタが呼ばれる箇所から F11 でじっくりステップ実行していっても、ASSERT 位置にたどり着けます。

CMultiDocTemplate クラスのコンストラクタのソース(VS2005 添付のソース)をみる限りは、

 ASSERT(m_docList.IsEmpty());

となっているため、InitInstance() でドキュメントを作る時点ではドキュメントは空でないといけない、ということだと思います。
もしかしたら、CMultiDocTemplate の親クラスのコンストラクタ内で ASSERT しているのかもしれませんが、どちらにしろ、ASSERT している原因が分からなければ対応は出来ないと思いますよ。
補足コメント
sakuzo3

お礼率 40% (2/5)

ASSERTは「doctempl.cpp」の以下の場所で出ます。
CDocTemplateのコンストラクタです。
初心者なもので何がマズくてここでASSERTが出るのか分かりません。

-----------------
CDocTemplate::CDocTemplate(UINT nIDResource, CRuntimeClass* pDocClass,
CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass)
{
 ASSERT_VALID_IDR(nIDResource);
 ASSERT(pDocClass == NULL ||
  pDocClass->IsDerivedFrom(RUNTIME_CLASS(CDocument))); ←※ここで出る

 ASSERT(pFrameClass == NULL ||
  pFrameClass->IsDerivedFrom(RUNTIME_CLASS(CFrameWnd)));
 ASSERT(pViewClass == NULL ||
  pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));
投稿日時:2006/07/24 16:28
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ