環境は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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
"COriginalView" が何なのか判りませんが、要はDLL側にあるビューで CMultiDocTemplate が成功しないと言う事でしょうか。
VisualStudio2005 が手元に無いのですが、MDI側のどこかに CRuntimeClass* p = RUNTIME_CLASS(CDllView);
を書いても失敗するのでしょう。
どうすれば解決するか判りませんが、MDI側で CDllView の派生クラスは作成できませんか?
この回答への補足
コメント頂きありがとうございます。
COriginalViewはDLL側で作成したビュークラスです。
(テンプレートとなるダイアログを作成しウィザードを使用してクラスを作成しました)。
CRuntimeClass* p = RUNTIME_CLASS(COriginalView); は実行できました(エラー無し)。
また、MDI側でCOriginalViewの派生を作成しそれを用いても状況は変わらずです。。。
ちなみにドキュメントクラスですが、MDI側で作成したクラス(もちろん動作可能)をDLL側へ移したものを使用しています。
No.1
- 回答日時:
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)));
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがない?
-
FriendとPublicの違い。。。
-
名前空間について
-
【ASP.NET】 独自で作成したク...
-
VC++ Express m_hWnd
-
SetTimerの行でアサートエラー...
-
ダイアログ表示時にチェックボ...
-
このコンパイルエラーの意味に...
-
C++ protectedにアクセス不可
-
form1 から form2 へのデータの...
-
C#で通常のbuttonコントロール...
-
C#で定数クラスをシングルトン...
-
不要になった、普通の構造体の処理
-
VC6 コンパイルエラー C2248に...
-
クラスのアドレスを引数として...
-
エディットコントロールでEnter...
-
継承を重ねた場合のコストはど...
-
DebugクラスとTraceクラスの違い
-
ポインタのキャストについて
-
C++/CLIからC++の呼び出しで例外
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
(UWSC) 「#32770」の意味わかり...
-
C++ protectedにアクセス不可
-
ダイアログ表示時にチェックボ...
-
エディットコントロールでEnter...
-
【ASP.NET】 独自で作成したク...
-
このコンパイルエラーの意味に...
-
DataGridViewのセルに斜線を引...
-
ダイアログクラスのコントロー...
-
MFCのCListCtrlでスクロールを検出
-
C++で継承元のクラスの代入演算...
-
MFCのドラッグ&ドロップについて
-
イベントにAddHandlerされてい...
-
MFCアプリのコマンドラインでパ...
-
DebugクラスとTraceクラスの違い
-
[MFC] CWnd::MessageBoxの警告...
-
個々の関数について継承してい...
-
クラスのアドレスを引数として...
-
関数の呼び出し元の検索
おすすめ情報