0

私の MFC SDI アプリケーションでは、ドキュメントを保存するために CDocument::DoSave をオーバーライドしようとしています。テキスト コントロールを作成するために、3 番目のコンポーネント (TxTextControl) を使用しています。ドキュメントを保存するとファイルが作成されますが、約 1 分後にアプリがクラッシュし、ole32.dll で読み取りアクセス エラー 0xFEEEFEEE が発生します。これは私のコードです.txtCtrlは私のコンポーネントです:

BOOL CEditorTxDoc::DoSave(LPCTSTR lpszPathName, BOOL bReplace)
{
CString path, nome;
VARIANT vt1, vt2, vt3;
POSITION pos = GetFirstViewPosition();
CEditorTxView *pView = (CEditorTxView*)this->GetNextView(pos);

VariantInit(&vt1);
vt1.vt = VT_INT;
vt1.intVal = -1;
VariantInit(&vt2);
vt2.vt = VT_INT;
vt2.intVal = 3;
VariantInit(&vt3);
vt3.vt = VT_BOOL;
vt3.boolVal = FALSE;

if (lpszPathName == NULL) {
    CFileDialog fSaveDlg(FALSE);

    fSaveDlg.m_pOFN->lpstrFilter = _T("File Tx (*.tx)");
    fSaveDlg.m_pOFN->lpstrDefExt = _T("tx");
    fSaveDlg.m_pOFN->lpstrTitle = _T("Salva documento");
    fSaveDlg.m_pOFN->lpstrInitialDir = _T("c:");

    if(fSaveDlg.DoModal()==IDOK)
    {
        path = fSaveDlg.GetPathName();
        nome = fSaveDlg.GetFileName();

        pView->txtCtrl.Save(path, vt1, vt2, vt3);
        SetTitle(nome);
        SetModifiedFlag(FALSE);
        SetPathName(path);
    }
} else {
        pView->txtCtrl.Save(GetPathName(), vt1, vt2, vt3);
        SetModifiedFlag(FALSE);
}

return TRUE;
}
4

1 に答える 1

1

マジック デバッグ値:

FEEEFEEE 解放されたヒープ メモリをマークするために Microsoft の HeapFree() によって使用されます

つまり、コードが解放されたメモリをまだ生きているかのように処理するという事実から問題が発生します。問題を特定のコード フラグメントに切り分けるには、例外発生時のコール スタック情報をデバッグして使用します。

于 2012-10-04T08:41:23.663 に答える