2009-11-20 52 views
0

我從CStdioFile派生的MFC類聲明如下HOWTO追查可變腐敗

// Datafile.h 
class CDataFile : public CStdioFile 
{ 
public: 
CDataFile(void); 
~CDataFile(void); 

int OpenFile(LPCWSTR FileName); 
} 

我的OpenFile函數被調用的文件名變量被損壞後。

int CDataFile::OpenFile(LPCWSTR FileName) 
    { 

m_OpenFlags = CFile::modeNoTruncate | CFile::modeReadWrite; 

// Before open. FileName = "c:\afile.txt" 

    if (!Open(FileName, m_OpenFlags, NULL)) 

     { 
      return GetLastError(); 
     } 

//After open. FileName = ""ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮވĚᗸ÷ᘸ÷㼠碞­" 

// other stuff 
} 

} 

但如果我更改文件名以

WCHAR FileName[] = _T("c:\\afile.txt"); 

打開文件之前變量文件名保持不變。我已經在MFC/Winapi中看到過這種行爲,並且總是通過使用字符數組而不是LPCWSTR或CString來解決它。爲什麼會發生?以及用VS調試器追蹤這些問題的最佳方法是什麼?腐敗出現在MFC文件在這裏發生Filecore.cpp

if (!CFile::Open(lpszFileName, (nOpenFlags & ~typeText), pException)) 
    return FALSE; 
+1

(http://msdn.microsoft.com/en-us/library/hwbccf8z.aspx)表示它需要LPCTSTR而不是LPCWSTR(普通字符與寬字符串)。也許這是問題? – 2009-11-20 17:20:53

+0

我不這麼認爲「typedef LPCWSTR LPCTSTR;」 – Canacourse 2009-11-20 17:24:31

回答

2

看看使用data breakpoint(也稱爲硬件斷點。)當內存被修改,您可以打破。