none
Debug Assertion Failed! エラー RRS feed

  • 質問

  • Vista Home premium
    VS 2008
    MFC
    で、単純な画像表示プロジェクトをビルドし、Debug > Run しています。
    BMP, JPGなどのファイルをwindowアプリで表示させるだけです。

    プログラムの設定は、
    * Project名 : Viewer
    * MDI
    * CViewerView extend CHTMLView

    MFC アプリケーションのプロジェクト生成後、編集する箇所は以下の 2箇所のみです。

    void CViewerView::OnInitialUpdate()
    {
        CHtmlView::OnInitialUpdate();
    
        Navigate2(_T("c:\\MyFile.htm"),NULL,NULL); <--- this.
    }

    void CMDIImageDoc::Serialize(CArchive& ar)
    {
    	if (ar.IsStoring())
    	{
    		// TODO: 
    	}
    	else
    	{
    		// TODO: 
    CFile *cf; cf = ar.GetFile(); CString cs ; cs = L"<HTML><IMG SRC=\"" + cf->GetFilePath() + L"\"></HTML>"; CStdioFile csf; csf.Open( L"C:\\MyFile.htm", CFile::modeCreate | CFile::modeWrite ); csf.WriteString( cs ); csf.Close(); } }
    です。

    ビルドは成功しましたが、デバッグ実行で「ファイル」>「開く」>"AABB.JPG" すると、
    「Debug Assertion Failed!」 エラーが出ます。

    Program: D:\User\Projects\Viewer\Debug\Viewer.exe
    File: f:\dd/vctools\vc7libs\ship\atlmfc\src\mfc\filetxt.cpp
    Line: 192

    For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

    「再試行」ボタンを押すと、
    「Viewer.exe によってブレークポイントが発生しました」ダイアログが出て、
    コードエディタには、filetxt.cpp が出て、↓の場所で黄色→マークが指されます。
    filetxt.cpp
    void CStdioFile::WriteString(LPCTSTR lpsz)
    {
    	ASSERT(lpsz != NULL);
    ここ→	ASSERT(m_pStream != NULL);
    	
    	if (lpsz == NULL)
    	{
    		AfxThrowInvalidArgException();
    	}
    
    	if (_fputts(lpsz, m_pStream) == _TEOF)
    		AfxThrowFileException(CFileException::diskFull, _doserrno, m_strFileName);
    }
    m_pStream の値は、 0x00000000 {_ptr=??? _cnt=??? _base=??? ...}    _iobuf * と表示されてます。

    「中断」せず「継続」すると、また別の「Debug Assertion Failed!」 エラーがでます。

    Program: D:\User\Projects\Viewer\Debug\Viewer.exe
    File: f:\dd/vctools\vc7libs\crt_bld\self_x86\srt\src\fputws.c
    Line: 48

    For information on how your program can ...

    「再試行」ボタンを押すと、コードエディタでfputws.c の黄色→マークが表示されます。
    int __cdecl fputws (
            const wchar_t *string,
            FILE *stream
            )
    {
            size_t length;
            int retval = 0;
    
            _VALIDATE_RETURN((string != NULL), EINVAL, WEOF);
    ここ→     _VALIDATE_RETURN((stream != NULL), EINVAL, WEOF);
    
            length = wcslen(string);
    ...
    ...

    別の人のPCでは、問題なくデバッグ実行で、画像ファイルが表示できるようなのです。
    私のPCの環境に足りないものがあるのでしょうか?

    長くなりましたが、宜しくお願いします。

    2010年2月10日 6:35

回答

  • Vista の場合 C:\ は特別なフォルダーなので、一般的なアプリからはファイルを新規作成できないように保護されています。
    アプリを管理者として実行するとか、そもそも C:\ に MyFile.htm を作らないとかすれば、問題は出なくなると思います。

    # 問題なく動いている他の人達は XP だったり、UAC を OFF にしていたり(何と危険な)するのでしょうか。

    • 回答としてマーク fedoracche 2010年2月10日 9:12
    2010年2月10日 8:10

すべての返信

  • Vista の場合 C:\ は特別なフォルダーなので、一般的なアプリからはファイルを新規作成できないように保護されています。
    アプリを管理者として実行するとか、そもそも C:\ に MyFile.htm を作らないとかすれば、問題は出なくなると思います。

    # 問題なく動いている他の人達は XP だったり、UAC を OFF にしていたり(何と危険な)するのでしょうか。

    • 回答としてマーク fedoracche 2010年2月10日 9:12
    2010年2月10日 8:10
  • 原因は、Vista の機能だったんですね。
    いや、勉強になりました。
    ありがとうございます。
    2010年2月10日 9:14
  • 原因は、Vista の機能だったんですね。
    Vista 以降の Windows(Windows 7 を含む)での仕様です。

    「原因は」と言ってしまうとそれが悪いように聞こえてしまいます。
    しかし、今はそういった場所に書き込むプログラム、あるいはそのプログラムを作る方が悪いという風にみなされてきています。

    UAC が導入された経緯や目指すものをこの機会にお調べください。
    そして、テストプログラムであっても、C:\ には書かないなど、自然に動けるようになりましょう。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年2月10日 13:52
    モデレータ