■ 空のドキュメントの作成に失敗しましたとエラーがでます

[Visual C++ Q & A 掲示板] [過去ログの一覧]


流星 2005/09/12(月) 22:08:13
初めまして。昨日まで正常に動作できていた上に、コンパイル時はエラーにならないのに実行しようとするとエラーになってしまいます。
どこでどうおかしくなったのかわからず困っています・・・
どなたか教えて助けて下さい。よろしくお願いします。
/////////////////////////////////////////////////////////////////////// CFileCompereApp クラスの初期化

BOOL CFileCompereApp::InitInstance()
{
  AfxEnableControlContainer();

  // 標準的な初期化処理
  // もしこれらの機能を使用せず、実行ファイルのサイズを小さく
  // したければ以下の特定の初期化ルーチンの中から不必要なもの
  // を削除してください。

#ifdef _AFXDLL
   Enable3dControls(); // 共有 DLL の中で MFC を使用する場合にはここを呼び出してください。
#else
   Enable3dControlsStatic(); // MFC と静的にリンクしている場合にはここを呼び出してください。
#endif

  // 設定が保存される下のレジストリ キーを変更します。
  // TODO: この文字列を、会社名または所属など適切なものに
  // 変更してください。
  SetRegistryKey(_T("Local AppWizard-Generated Applications"));
  LoadStdProfileSettings(0);  // 標準の INI ファイルのオプションをロードします (MRU を含む)

  // アプリケーション用のドキュメント テンプレートを登録します。ドキュメント テンプレート
  //  はドキュメント、フレーム ウィンドウとビューを結合するために機能します。

  CSingleDocTemplate* pDocTemplate;
  pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,
RUNTIME_CLASS(CFileCompereDoc),
RUNTIME_CLASS(CMainFrame),       // メイン SDI フレーム ウィンドウ
RUNTIME_CLASS(CFileCompereView));
AddDocTemplate(pDocTemplate);

  // DDE、file open など標準のシェル コマンドのコマンドラインを解析します。
  CCommandLineInfo cmdInfo;
  ParseCommandLine(cmdInfo);

  // コマンドラインでディスパッチ コマンドを指定します。
  if (!ProcessShellCommand(cmdInfo))  <==ここでエラーになってしまう。
    return FALSE;

  // メイン ウィンドウが初期化されたので、表示と更新を行います。
  m_pMainWnd->ShowWindow(SW_SHOW);
  m_pMainWnd->UpdateWindow();

  return TRUE;
}

シャノン 2005/09/12(月) 22:16:29
リソースをいぢくりませんでしたか?
メニュー、アイコン、アクセラレータ、ツールバー、ストリングテーブル等のリソースに IDR_MAINFRAME って ID を持つものがないと、そのエラーで落ちます。

流星 2005/09/12(月) 22:41:39
リソース・・・( ̄ヘ ̄)ウーン覚えがないです^^;
それって別に新しくプロジェクト作ってそこのリソースファイルを
今のとこにコピーしてもダメですよね^^;

流星 2005/09/12(月) 23:15:42
どうやらリッチエディットを無くすと動くのですが・・・何が原因でしょうか??

シャノン 2005/09/13(火) 01:50:16
あぁ、じゃあアレだ。

MSDN より抜粋

> 注意   ダイアログ ボックスでリッチ エディット コントロールを使用している場合は (アプリケーションが SDI、MDI、ダイアログのどれがベースかにかかわらず)、ダイアログ ボックスの表示前に AfxInitRichEdit を 1 回呼び出す必要があります。通常、この関数は、プログラムの InitInstance メンバ関数で呼び出します。この関数は、ダイアログ ボックスを最初に表示するときだけ呼び出します。ダイアログ ボックスを表示するたびに呼び出す必要はありません。CRichEditView を操作するときは、AfxInitRichEdit を呼び出す必要はありません。

流星 2005/09/13(火) 07:33:25
シャノンさん度々ありがとうございます。MSDNが見れない環境なので助かります。試しに下記のようにAfxInitRichEditを追記してみましたが直りません・・・どうしてでしょう?AfxInitRichEditの追記した箇所と、一番最初の書き込みで書いた実際にソース上でエラーが発生する箇所を少し詳しく書いてみたので引き続きご教授の程よろしくお願い致します。
BOOL CFileCompereApp::InitInstance()
{
  AfxEnableControlContainer();
  AfxInitRichEdit(); <== ここに追記した
  // 標準的な初期化処理
  // もしこれらの機能を使用せず、実行ファイルのサイズを小さく
  // したければ以下の特定の初期化ルーチンの中から不必要なもの
  // を削除してください。
〜〜(中略)〜〜
 // コマンドラインでディスパッチ コマンドを指定します。
  if (!ProcessShellCommand(cmdInfo))  <==ここでエラーになってしまう。
    return FALSE;           (下記に)

 // メイン ウィンドウが初期化されたので、表示と更新を行います。
 m_pMainWnd->ShowWindow(SW_SHOW);
 m_pMainWnd->UpdateWindow();

 return TRUE;
}
-------------------------------------------------------------------
・上記のソースの落ちてしまうif文で呼ばれる
// virtual override of CWnd::Create
BOOL CFormView::Create(LPCTSTR /*lpszClassName*/, LPCTSTR /*lpszWindowName*/,
DWORD dwRequestedStyle, const RECT& rect, CWnd* pParentWnd, UINT nID,
CCreateContext* pContext)
{
ASSERT(pParentWnd != NULL);
ASSERT(m_lpszTemplateName != NULL);

m_pCreateContext = pContext;    // save state for later OnCreate

#ifdef _DEBUG
// dialog template must exist and be invisible with WS_CHILD set
if (!_AfxCheckDialogTemplate(m_lpszTemplateName, TRUE)) <==ここの判定に引っかかってエラー処理に入ってしまう。
{
ASSERT(FALSE);          // invalid dialog template name
PostNcDestroy();        // cleanup if Create fails too soon
return FALSE;
}

流星 2005/09/13(火) 08:00:57
[[解決]]

仕方ないのでバックアップで状態を戻しました。
シャノンさん、ありがとうございました。

シャノン 2005/09/13(火) 15:06:50
AfxInitRichEdit2 だとどう?

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library