none
空のドキュメントの作成に失敗しました RRS feed

  • 質問

  • いつもお世話になります。

    VS2010でビルドしたMFCベースのSDIプルグラムをVS2015 communityでビルドしなおしたところタイトルのメッセージが表示されます。

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;   ← ここで抜けます。
                               ・
                               ・
                               ・
    

    どうすれば良いのでしょうか?

    2016年4月11日 7:27

回答

  • 以下の点を確認してみてはどうでしょう。

    1.CMainFrameがCFrameWndを継承していること。
     CMainFrameが定義されているヘッダーを確認します。
     新しいフレームワークではCFrameWndExから派生している場合があります。
     (注意)ご提示のコードによるとCFrameWndから派生していることを示唆しています。

    2.CMainFrame::PreCreateWindow()で、派生元のPreCreateWindow()を実行し、
     かつ、成功していること。

    現時点ではとりあえずこの二つをやってみてはどうでしょう。

    2016年4月12日 1:32
  • 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の標準テンプレートから新規作成して、必要なクラスや関数を移行していくという手もあるかもしれません。

    2016年4月12日 8:23

すべての返信

  • 試しに、Visual Studio 2010で作成したMFCのSDI(複合ドキュメントサポート)のプロジェクトをVisual Studio 2015で開き、ビルドしてみましたが、ご質問のようなメッセージは表示されず。正常に起動しました。

    一般論になり申し訳ないのですが、ご確認がまだでしたら、[MSVC]「空のドキュメントの作成に失敗しました」のエラーが出る をご確認ください。

    また、インターネットで調べたところレジストリやユーザーのプロファイルフォルダ内の設定でもプログラムによって再現することもあるようですので、別のユーザーアカウントを新規作成して、そのアカウントでログインして再現するか確認してみてもよいかもしれません。


    2016年4月11日 9:29
  • 以下の点を確認してみてはどうでしょう。

    1.CMainFrameがCFrameWndを継承していること。
     CMainFrameが定義されているヘッダーを確認します。
     新しいフレームワークではCFrameWndExから派生している場合があります。
     (注意)ご提示のコードによるとCFrameWndから派生していることを示唆しています。

    2.CMainFrame::PreCreateWindow()で、派生元のPreCreateWindow()を実行し、
     かつ、成功していること。

    現時点ではとりあえずこの二つをやってみてはどうでしょう。

    2016年4月12日 1:32
  • アドバイス有り難うございます。

    1,2とも大丈夫みたいです。

    ただ、CMainFrame::PreCreateWindow()は2回呼ばれ、2回とも(派生元のPreCreateWindow()も)TRUEを返しています。

    2016年4月12日 7:36
  • 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の標準テンプレートから新規作成して、必要なクラスや関数を移行していくという手もあるかもしれません。

    2016年4月12日 8:23
  • まず、通常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:42
  • お世話になります。

    たしかに最初はvs2003でした。vsを変えるたびに悩まされています。

    根本的に無理が有るのでしょう。

    いまvs2015で雛形を作りました。

    CMainFrameはこうなっています。

    設定に問題が有るのでしょうか?

    class CMainFrame : public CFrameWnd
    {
    protected: // シリアル化からのみ作成します。
    	CMainFrame();
    	DECLARE_DYNCREATE(CMainFrame)
    
    2016年4月13日 4:12
  • CMainFrame が CFrameWndEx の派生になるか、CFrameWnd の派生になるかは Visual Studio のバージョンによるものではなく、MFCのアプリケーションウィザードの設定によるみたいです。

    ウィザードのユーザーインターフェイス機能のページで、「クラシックメニューを使用する」にチェックを入れ、かつ「クラシックのドッキング可能ツールバーを使用する」のチェックがオフの時に、CMainFrame は CFrameWnd からの派生になるようでした。それ以外は CFrameWndEx からの派生となりました。

    既存のソース(CFrameWnd から派生)を利用して、Visual Studio 2015 の MFC テンプレートからアプリケーションを作り直す場合は、CFrameWnd からの派生となるようにプロジェクトを設定したほうが、その後のソースコードの移行作業が楽になるかと思います。(過去つまずいた経験があります・・・)




    2016年4月13日 5:22
  • 確認ですが、ウィザードで初期のコードを自動生成するときのオプションで、
    「ドキュメント/ビューアーキテクチャのサポート」のチェックを「外し」てませんか。
    もし、そうなら話が少々変わってきます。

    まず、ご自身の選択として、「ドキュメント/ビューアーキテクチャのサポート」について

    1.使わない。
    2.使うつもり。

    のどちらを目指してますか。まず、1.の場合、

    1.1 ドキュメントクラスが無いはずなので、本質的に「空のドキュメントの作成に失敗しました」
      というメッセージが出るはずがないと言えます。

    2.の場合、

    2.1 ウィザードのオプションで「ドキュメント/ビューアーキテクチャのサポート」のチェックを入れなければならない。
      この場合、必然的にメインフレームの派生元は「CFrameWndEx」となるばずです。

    と言えるのですが、どのようにお考えでしょう。

    2016年4月13日 5:24
  • お世話になります。

    ウィザードで雛形を作り、他のクラスを追加していくことにします。

    いろいろな情報を有難うございました。

    2016年4月14日 3:07