本人要做一个和智能卡读写器通信的程序,开始的时候没有什么大的错误。但是,过了几天的时候出现了
First-chance exception in Mifare.exe (KERNEL32.DLL): 0xC0000005: Access Violation错误。代码:
class CMifareDlg : public CDialog
{
// Construction
public:
unsigned char strToInt(CString strNum);
void OnSend(int num,unsigned char *des);
CString strCommPort;
long GetBaud();
long m_baud;
CMifareDlg(CWnd* pParent = NULL); //standard constructor// Dialog Data
//{{AFX_DATA(CMifareDlg)
enum { IDD = IDD_MIFARE_DIALOG };
CListBox m_CommStatusCtrl;
CComboBox m_KeyTypeCtrl;
CComboBox m_BaudCtrl;
CString m_Key;
int m_SectorNumb;
CMSComm m_MscommCtrl;
int m_Port;
//}}AFX_DATA // ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMifareDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL// Implementation
protected:

int OnBCCCheck(int ,unsigned char *);
unsigned char *ExaInputData();
void OnCommMscomm1();
HICON m_hIcon;
CString m_strPortSetting; //port状态用
CString m_strCommSetting; //通信状态用 // Generated message map functions
//{{AFX_MSG(CMifareDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnConnect();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnDisconnect();
afx_msg void OnWriteData();
DECLARE_EVENTSINK_MAP()
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
int m_nOverTime;
BOOL m_ReceiveACK;
BOOL m_ReceiveSTX;
BOOL m_ReceiveNAK;
BOOL m_ShowConnectStatus;
BOOL m_PortStatus;
unsigned char m_ReceiveERR;

};CMifareDlg::CMifareDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMifareDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMifareDlg)
m_Key = _T("");
m_SectorNumb = 0;
m_Port = -1;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMifareDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMifareDlg)
DDX_Control(pDX, IDC_COMMU_STATUS, m_CommStatusCtrl);
DDX_Control(pDX, IDC_KEY_TYPE, m_KeyTypeCtrl);
DDX_Control(pDX, IDC_COMBO_BAUD, m_BaudCtrl);
DDX_Text(pDX, IDC_KEY, m_Key);
DDV_MaxChars(pDX, m_Key, 12);
DDX_Text(pDX, IDC_SECTOR_NUMB, m_SectorNumb);
DDX_Control(pDX, IDC_MSCOMM1, m_MscommCtrl);
DDX_Radio(pDX, IDC_RADIO1, m_Port);
//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CMifareDlg, CDialog)
//{{AFX_MSG_MAP(CMifareDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CONNECT, OnConnect)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_DISCONNECT, OnDisconnect)
ON_BN_CLICKED(IDC_WRITE_DATA, OnWriteData)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CMifareDlg message handlersBOOL CMifareDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// 初始化:

m_Key.Format("FFFFFFFFFF");
m_Port=0; //选中第一个串口“com1”
m_BaudCtrl.SetCurSel(3);//选择波特率19200
m_KeyTypeCtrl.SetCurSel(0); //认证方式选中“密码A”
m_ReceiveACK=FALSE;
m_ReceiveSTX=FALSE;
m_ShowConnectStatus=FALSE;
m_ReceiveNAK=FALSE;

UpdateData(FALSE);

return TRUE;  // return TRUE  unless you set the focus to a control
}void CMifareDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}////????????????如果是Ctrl+F5运行的话,没有错误提示。如果是:F5运行的话则在标识????处出错:
unhandled exception in kernel32.dll:0x00000005 Access violation。我把我写的代码全部用注释“/*,*/”拿掉了。请不要怀疑是其它我写代码的问题。按F5运行后,弹出一个对话框主界面。无论怎样操作对话框都不会出错,就是在点“X”的时候,也就是退出的时候出现:
Visual C++
unhandled exception in kernel32.dll:0x00000005 Access violation
你一点OK就进入了DEBUG模式下汇编里面。下面提示是:
Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
Loaded symbols for 'C:\WINDOWS\system32\MFC42D.DLL'
Loaded symbols for 'C:\WINDOWS\system32\MSVCRTD.DLL'
Loaded 'C:\WINDOWS\system32\gdi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\user32.dll', no matching symbolic information found.
Loaded symbols for 'C:\WINDOWS\system32\MFCO42D.DLL'
Loaded 'C:\WINDOWS\system32\shimeng.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\imm32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\advapi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\rpcrt4.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\secur32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\lpk.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\usp10.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comctl32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\uxtheme.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcrt.dll', no matching symbolic information found.
Loaded 'D:\Program Files\360\360safe\safemon\safemon.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\shell32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\shlwapi.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ole32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\oleaut32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcp60.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\psapi.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ws2_32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ws2help.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\urlmon.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\version.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\MSCTF.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\apphelp.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msctfime.ime', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\clbcatq.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comres.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\MSCOMM32.OCX', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\sxs.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\olepro32.dll', no matching symbolic information found.
Loaded 'C:\Program Files\StarDict\TextOutSpy.dll', no matching symbolic information found.
Loaded 'C:\Program Files\StarDict\TextOutHook.dll', no matching symbolic information found.
First-chance exception in Mifare.exe (KERNEL32.DLL): 0xC0000005: Access Violation.
请问是什么原因??怎么解决???

解决方案 »

  1.   

    补充一下:
    把我的代码全都放上面了之后的情况是,执行到下面的函数后才出现上面的错误。
    CString::~CString()
    //  free any attached data
    {
    if (GetData() != _afxDataNil)
    {
    if (InterlockedDecrement(&GetData()->nRefs) <= 0)//////???
    FreeData(GetData());
    }
    }这是一个MFC里面函数库里面的东西。我首先怀疑我的程序里面的CString变量,但是,把我的代码全都注释掉后为什么调试时候还是同样的错误。就是开头的那个描述。期待高手!!!
    期待高手!!!
      

  2.   

    一看就是内存句柄的非法访问,你调试一下call stack看看是在哪个函数里出现错误,看看那个函数的一些指针这类的是否有效?
      

  3.   

    我也是有这个问题,感觉是CString出了问题,又不知道怎么做,我的问题是跳出子函数的时候就弹出那个错误