- 締切済み
MFC オリジナルDLLからエクスポートしたビュークラスを CMultiDocTemplate で登録すると Assert Failed! が出る
環境は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)
- 専門家の回答
みんなの回答
- davidfox
- ベストアンサー率58% (21/36)
"COriginalView" が何なのか判りませんが、要はDLL側にあるビューで CMultiDocTemplate が成功しないと言う事でしょうか。 VisualStudio2005 が手元に無いのですが、MDI側のどこかに CRuntimeClass* p = RUNTIME_CLASS(CDllView); を書いても失敗するのでしょう。 どうすれば解決するか判りませんが、MDI側で CDllView の派生クラスは作成できませんか?
- z64423
- ベストアンサー率53% (26/49)
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)));
補足
コメント頂きありがとうございます。 COriginalViewはDLL側で作成したビュークラスです。 (テンプレートとなるダイアログを作成しウィザードを使用してクラスを作成しました)。 CRuntimeClass* p = RUNTIME_CLASS(COriginalView); は実行できました(エラー無し)。 また、MDI側でCOriginalViewの派生を作成しそれを用いても状況は変わらずです。。。 ちなみにドキュメントクラスですが、MDI側で作成したクラス(もちろん動作可能)をDLL側へ移したものを使用しています。