• ベストアンサー

VC++2003でSDIのMFCアプリ作成中です。

アイコン上にファイルをドロップし、ファイルをオープンする動作を実装し、 正常系は動作確認できました。 しかし、ファイルに読み込み制限などをかけていた場合、こちらのエラー処理に入る前に Windows内部エラー処理に入ってしまうようで、「○○へのアクセスは拒否されました」と ダイアログが表示されます。 デバッグで見て云ったところ、ProcessShellCommand(cmdInfo)の内部でエラーが発生し、 強制的におちているようですが、具体的にどこのクラス、メソッドでエラーを受け取って いるのでしょうか? オーバーライドしてエラー処理を自分で実装したいと考えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ドキュメントクラスのOnOpenDocumentの中で実行する GetFileがNULLを返した場合にそのMesseageBoxを表示しているようです アプリ側のドキュメントクラスに OnOpenDocumentを作成しておいて BOOL CXXXDocument::OnOpenDocument( LPCTSTR lpszPathName ) {   CFileException fe;   CFile* pFile = NULL;   pFile = GetFile( lpszPathName, CFile::modeRead, &fe );   if ( pFile ) {     // 正常に開けたので CDocumentで開けるようにココでは閉じる     pFile->Close();   } else {     // ここでエラー処理をする     return FALSE;       }   return CDocument::OnOpenDocument(lpszPathName ); } といった具合でいいように思います

gsfgsgshh
質問者

補足

CXXXDocumentというのはCDocumentを継承して新たにクラスを宣言するのでしょうか?

その他の回答 (2)

回答No.3

> CXXXDocumentというのはCDocumentを継承して新たにクラスを宣言するのでしょうか? 例えば、Testというプロジェクトを作成すると、CTestDocというCDocumentクラスから派生したクラスが自動で作成されますよね。それのことです。

回答No.2

virtual void CDocument::ReportSaveLoadException をオーバーライドする方法もあります。 OnOpenDocumentでエラーになった場合は、この関数が呼び出されます。 CDocument::ReportSaveLoadException http://msdn.microsoft.com/ja-jp/library/sw5196eb(v=VS.71).aspx

関連するQ&A

  • VC++2003SDIでMFCアプリ作成中です。

    最近使ったファイルからファイルを選んだ際、自動的にタイトルバーが更新されるようですが、これはどのクラスのどのメソッドで行われているのでしょうか? ある条件のときのみタイトルバーを更新したいので、処理を変更する為オーバーライドしたいと考えております。 どなたか教えていただけませんでしょうか?

  • VC++、MFCでSDIでアプリ作成中

    現在、VC++、MFCでSDIでアプリ作成中です。 アイコン上にファイル(txtファイル)をドラッグ&ドロップしてメモ帳を起動したいです。 ただ、ドロップされたファイルはうまく読み込めるのですが、そのファイルを開く(表示)することができません。 ドロップされたファイルは、C○○View.cppで int C○○View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: この位置に固有の作成用コードを追加してください CStringArray argv; if( IsDropOnIcon( &argv, TRUE ) ){ int i; for( i = 0; i < argv.GetCount(); i++ ){ MessageBox( argv[ i ], "ドロップされたファイルは", MB_OK ); Read(argv[i]); } } } BOOL C○○View::IsDropOnIcon( CStringArray* argv, BOOL acceptFolder ) { CString cmdlin = ""; CString resToken; char* p; int startnum = 0; p = AfxGetApp()->m_lpCmdLine; if( strlen( p ) == 0 || p[ 0 ] == '-') return FALSE; cmdlin = p; resToken= cmdlin.Tokenize( "\"", startnum ); while( resToken != "" ){ if( resToken != " " && IsExist( resToken, acceptFolder ) ) argv->Add( resToken ); resToken= cmdlin.Tokenize( "\"", startnum ); }; return TRUE; } /* 引数で貰った文字列がファイルかどうかをチェック */ BOOL C○○View::IsExist( CString filepath, BOOL acceptFolder) { CFile fp; if( fp.Open( filepath, CFile::modeRead ) ){ fp.Close(); return TRUE; } return FALSE; } のargv[i]で取得しています。 これが、Read(arg[i])でうまく読み込めません。 ちなみにRead(CString filename)は正しく動くことは確認済みです。 Read(arg[i])を入れる場所がOnCreateがいけないとは思うのですが、どのタイミングで 読み込めばいいかがわかりません。 どなたか教えて頂けないでしょうか?

  • VC++でMFCアプリ作成中です。

    MFCの既存のフレームで、「最近使ったファイル」という欄があります。 これを選んだ際に、指定したプログラムでそのファイルを開きたいのですが、うまくいきません。 どうすればよろしいでしょうか? HogeView.cpp ...(省略) /*************************************** OnOpenRecentFileのオーバーライド ***************************************/ BOOL CWinApp::OnOpenRecentFile(UINT nID) { ASSERT_VALID(this); ASSERT(m_pRecentFileList != NULL); ASSERT(nID >= ID_FILE_MRU_FILE1); ASSERT(nID < ID_FILE_MRU_FILE1 + (UINT)m_pRecentFileList->GetSize()); int nIndex = nID - ID_FILE_MRU_FILE1; ASSERT((*m_pRecentFileList)[nIndex].GetLength() != 0);        /* 選んだファイルを表示 */ AfxMessageBox((*m_pRecentFileList)[nIndex]); CHogeView *myview = new CHogeView(); ★ myview->GetDocument()->SetFilePath((*m_pRecentFileList)[nIndex]); AfxMessageBox(myview->GetDocument()->GetFilePath()); myview->ReadFile((*m_pRecentFileList)[nIndex]); TRACE2("MRU オリジナル関数内: open file (%d) '%s'.\n", (nIndex) + 1, (LPCTSTR)(*m_pRecentFileList)[nIndex]); if (OpenDocumentFile((*m_pRecentFileList)[nIndex]) == NULL){ m_pRecentFileList->Remove(nIndex); } return TRUE; } /****************************************************************** ファイル読み込み ******************************************************************/ void CHogeViewerView::ReadFile(CString filename){ ...(省略) } コンパイルはできるのですが、どうやら★のところがうまく行かず、 Debug Assertion Failed! とエラーがでます。 何が原因なのでしょうか?

  • MFCでPDFビューアアプリ作成中

    アプリを起動する際に、レジストリでpdfのファイル対応付けを行います。 そしてpdfファイルをダブルクリックすることでファイルオープンをするのですが、(実装済み) タイトルバーが文字化けして正しく表示されません。 しかし、ファイルは正しい書式のときはうまく読み込めています。 つまり、タイトルバーの更新部分でおかしなことになっているようなのです。 しかも、なぜかドラッグ&ドロップでファイルを読み込んだ際はファイルも正しく表示されるし タイトルバーも正しく表示されます。 ちなみに、おかしくなるのは全角の文字がファイル名に入っているときです。 原因がわかる方いらっしゃいますでしょうか?

  • libdecodeqrをVC6.0のダイアログベースアプリで使いたいの

    libdecodeqrをVC6.0のダイアログベースアプリで使いたいの libdecodeqrをVC6.0のダイアログベースアプリで使いたいのですが、以下のような簡単なコードを書いたのですが、リンクで「error LNK2001: 外部シンボル *** は未解決です」となり、エラーになります。 OpenCVのインストールや設定はできております。 また、libdecodeqrのサンプルにあるsimple,webcam共にビルドし動作するのを確認できています。 // 画像読み込み IplImage* pImage = NULL ; pImage = cvLoadImage( strFilePath, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR ) ; // OPEN QrDecoderHandle hQRDecoder = qr_decoder_open() ; // ちょっとした処理 // CLOSE qr_decoder_close( hQRDecoder ); cvReleaseImage( &pImage ) ; よろしくお願いします。

  • VC++2003SDIでMFCアプリ作成中です。

    既存のメソッドである、ファイルを読み込むCDocManager::OpenDocumentFile (LPCTSTR lpszFileName)はどこでタイトルバーを更新しているのでしょうか? ファイルを開けた場合のみタイトルバーを更新したいです。 それともタイトルバーの更新は別の場所で行われているのでしょうか? どなたか教えていただきたいです。

  • VC++2003SDIでMFCアプリ作成中です。

    MFCで自動生成された画面だと、ステータスバーのチェックのON、OFFの切り替えができるようですが、ステータスバーの内容が自動で上書きされます。 ファイルオープンに成功した場合のみ更新したい場合はどうすればよろしいのでしょうか? どこでステータスバーを更新しているかも教えていただけると嬉しいです。

  • cocoaアプリで悩んでます。

    cocoaアプリで悩んでます。 よろしくお願いします。 Mac初心者です。 現在、cocoaAPI、Xcode3.0、InterfaceBuilder3.0(以下IB)を使ってアプリケーションを作っています。 <アプリ概要> <1>実行時に現れるダイアログにhtmlファイルをドラッグ&ドロップで貼り付けて表示。 <2>そのファイルがあるフルパスを表示。 <現状> 上記内容は実装できたのですが、<1>から<2>に進むためには設置したボタンをクリックしなければいけないような仕様になっています。 これをドラッグ&ドロップした時点で<2>の状態に進むようにしたいのです。 できるだけIBを利用したいと思っています。 WebViewクラスにはDownloadDelegate等のデリゲートが準備されているので、これを使うべきなのかなと思っているのですが、IB上で設置したインスタンスからデリゲートをどのように設定するのか、設定されたデリゲートに対するメッセージをどのように活用するのか(メソッドの引数には受け取ったメッセージを記述すべき?、どう書けば良いのか?、等)よく理解できていません。 デリゲートでメッセージを受け取った側のクラスのメソッドはどのように書けば良いかサンプルコードを記述して頂けるのであればうれしい限りです。 どうぞよろしくお願いしいます。

  • VC++でドラッグドロップ

    いつもお世話になっております。 今回はドラッグドロップについてお聞きしたいことがあります。 ダイアログに読取専用エディットボックスとリストボックスをつけて フォルダをドロップするとエディットにはフォルダのフルパス、 リストにはフォルダ内のファイルが列挙されるというソフトを 作っております。 現状、リストへフォルダをドロップした場合は以上の動作をしますが エディットへドロップしても何の反応も起きません。 今回はエディットとリストどちらにドロップしても同様の動作をしたく、 ResourceViewで両方ドラッグドロップ許可にしていますが、 リストのほうはドロップするとアイコンには+がでて、 ドロップ可能のようになっていますが実際にはWM_DROPFILESすら 捕まえることができません。 読み取り専用がよくない等いろいろ試しては見ましたが できませんでした。 リストのほうをドロップ不可(エディットのほうのみ可能)にした場合も 何もおきなかったのですが、そもそもエディットボックスではドロップは 不可能なのでしょうか? 以上の点をご教授願いたいです。 よろしくお願いします。 開発環境は VC++6.0 Professional SP2 OSは WindowsXP です。

  • MFCをDLL化してコンソールアプリから起動

    MFCアプリケーション(プロジェクト作成でMFCアプリケーションを選択)をDLL化して、コンソールアプリケーションからこのMFCをマルチスレッドで起動する方法を教えてください。MFCが起動後、コンソールアプリケーションの処理は次に進行し、MFCは操作可能な状態(アイコンなどがクリック可能で、青丸クルクルにはならない)にしたいです。また、コンソールアプリケーションからもMFCが操作可能にしたいです(例えば、コンソールアプリからAと入力するとファイルのオープンダイアログが開く、、、とか)。

専門家に質問してみよう