【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言

環境は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);

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

A 回答 (2件)

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



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

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

この回答への補足

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

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

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

ちなみにドキュメントクラスですが、MDI側で作成したクラス(もちろん動作可能)をDLL側へ移したものを使用しています。

補足日時:2006/07/24 16:11
    • good
    • 0

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



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

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

 ASSERT(m_docList.IsEmpty());

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

この回答への補足

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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報