トップ回答者
空のドキュメントの作成に失敗しました

質問
回答
-
以下の点を確認してみてはどうでしょう。
1.CMainFrameがCFrameWndを継承していること。
CMainFrameが定義されているヘッダーを確認します。
新しいフレームワークではCFrameWndExから派生している場合があります。
(注意)ご提示のコードによるとCFrameWndから派生していることを示唆しています。2.CMainFrame::PreCreateWindow()で、派生元のPreCreateWindow()を実行し、
かつ、成功していること。現時点ではとりあえずこの二つをやってみてはどうでしょう。
-
Visual Studio 2015で作成したMFCの標準テンプレートでも2回呼ばれているので、CMainFrame::PreCreateWindow()が2回呼ばれること自体は特に問題はないかと思います。
あとは、上記のサイトで記載されていますが、「CSingleDocTemplete で指定するリソース ID と 同じ番号のメニューやアイコンがない場合」ですかね。
また、CFrameWnd::OnCreateの直後でGetLastError()の値が参考になるかもしれません。
https://social.msdn.microsoft.com/Forums/ja-JP/5a62fce1-e73c-4bdd-b7d6-7d1042726526
過去にも同じようなエラーメッセージで投稿されているようですが、この時は解決はできたのでしょうか?
(発生個所は違うようですが、もしかすると同じような原因なのかもしれません。)
原因の特定に時間がかかりそうであれば、Visual Studio 2015のMFCの標準テンプレートから新規作成して、必要なクラスや関数を移行していくという手もあるかもしれません。
- 編集済み kenjinoteMVP 2016年4月12日 8:27
- 回答としてマーク 村尾DOS 2016年4月14日 3:16
すべての返信
-
試しに、Visual Studio 2010で作成したMFCのSDI(複合ドキュメントサポート)のプロジェクトをVisual Studio 2015で開き、ビルドしてみましたが、ご質問のようなメッセージは表示されず。正常に起動しました。
一般論になり申し訳ないのですが、ご確認がまだでしたら、[MSVC]「空のドキュメントの作成に失敗しました」のエラーが出る をご確認ください。
また、インターネットで調べたところレジストリやユーザーのプロファイルフォルダ内の設定でもプログラムによって再現することもあるようですので、別のユーザーアカウントを新規作成して、そのアカウントでログインして再現するか確認してみてもよいかもしれません。
- 編集済み kenjinoteMVP 2016年4月12日 8:03
-
以下の点を確認してみてはどうでしょう。
1.CMainFrameがCFrameWndを継承していること。
CMainFrameが定義されているヘッダーを確認します。
新しいフレームワークではCFrameWndExから派生している場合があります。
(注意)ご提示のコードによるとCFrameWndから派生していることを示唆しています。2.CMainFrame::PreCreateWindow()で、派生元のPreCreateWindow()を実行し、
かつ、成功していること。現時点ではとりあえずこの二つをやってみてはどうでしょう。
-
Visual Studio 2015で作成したMFCの標準テンプレートでも2回呼ばれているので、CMainFrame::PreCreateWindow()が2回呼ばれること自体は特に問題はないかと思います。
あとは、上記のサイトで記載されていますが、「CSingleDocTemplete で指定するリソース ID と 同じ番号のメニューやアイコンがない場合」ですかね。
また、CFrameWnd::OnCreateの直後でGetLastError()の値が参考になるかもしれません。
https://social.msdn.microsoft.com/Forums/ja-JP/5a62fce1-e73c-4bdd-b7d6-7d1042726526
過去にも同じようなエラーメッセージで投稿されているようですが、この時は解決はできたのでしょうか?
(発生個所は違うようですが、もしかすると同じような原因なのかもしれません。)
原因の特定に時間がかかりそうであれば、Visual Studio 2015のMFCの標準テンプレートから新規作成して、必要なクラスや関数を移行していくという手もあるかもしれません。
- 編集済み kenjinoteMVP 2016年4月12日 8:27
- 回答としてマーク 村尾DOS 2016年4月14日 3:16
-
まず、通常VS2010のウィザードで生成した MFC SDI のコードの場合、
メインフレームの派生元は「CFrameWndEx」のはずです。本件の場合「CFrameWnd」から派生していることをご確認いただたわけで、
一般的ではない状態であるということになります。
ひょっとするとVS2003頃のウィザードコードかもしれないということなのですね
(手元で最も古いVS2008では既にCFrameWndExから派生していました)。もうずいぶん前のことなので、うろ覚えになってしまい申し訳ないのですが、
一般的にメインフレームのOnCreate()で派生元のOnCreate()が実行されると1.CCreateContextを構築して、これにViewとDocのランタイムクラスを代入します。
2.このランタイムクラスはCSingleDocTemplateをnewしたときに与えたクラスです。
3.フレームがクライアントエリアを構築します。
4.フレームがCCreateContextのViewのランタイムクラスを使用してビューを構築します。
5.フレームがCCreateContextのDocのランタイムクラスを使用してドキュメントを構築します。1.と2.と3.は失敗しないと予測できるので、失敗する可能性があるのは4.5.です。
メインフレームからステップ実行しても、メッセージングで動作してしまいますので
多分追い切れないとおもいます。
従って、それら当該クラスのコンストラクタと、ビューのOnCreate()
等でブレークをはって失敗してないかトレースしてみてはどうでしょう。- 編集済み 仲澤@失業者 2016年4月13日 2:46
-
CMainFrame が CFrameWndEx の派生になるか、CFrameWnd の派生になるかは Visual Studio のバージョンによるものではなく、MFCのアプリケーションウィザードの設定によるみたいです。
ウィザードのユーザーインターフェイス機能のページで、「クラシックメニューを使用する」にチェックを入れ、かつ「クラシックのドッキング可能ツールバーを使用する」のチェックがオフの時に、CMainFrame は CFrameWnd からの派生になるようでした。それ以外は CFrameWndEx からの派生となりました。既存のソース(CFrameWnd から派生)を利用して、Visual Studio 2015 の MFC テンプレートからアプリケーションを作り直す場合は、CFrameWnd からの派生となるようにプロジェクトを設定したほうが、その後のソースコードの移行作業が楽になるかと思います。(過去つまずいた経験があります・・・)
- 編集済み kenjinoteMVP 2016年4月13日 5:25
-
確認ですが、ウィザードで初期のコードを自動生成するときのオプションで、
「ドキュメント/ビューアーキテクチャのサポート」のチェックを「外し」てませんか。
もし、そうなら話が少々変わってきます。まず、ご自身の選択として、「ドキュメント/ビューアーキテクチャのサポート」について
1.使わない。
2.使うつもり。のどちらを目指してますか。まず、1.の場合、
1.1 ドキュメントクラスが無いはずなので、本質的に「空のドキュメントの作成に失敗しました」
というメッセージが出るはずがないと言えます。2.の場合、
2.1 ウィザードのオプションで「ドキュメント/ビューアーキテクチャのサポート」のチェックを入れなければならない。
この場合、必然的にメインフレームの派生元は「CFrameWndEx」となるばずです。と言えるのですが、どのようにお考えでしょう。