关于Debug Assertion Failed!的问题
源代码如下:
// MyPlayerControl.h: interface for the CMyPlayerControl class.
//
//////////////////////////////////////////////////////////////////////
#ifndef _MY_PLAYER_CONTROL_H_
#define _MY_PLAYER_CONTROL_H_
#include<mmsystem.h> //插入多媒体头文件
class CMyPlayerControl
{
public:
CMyPlayerControl(); //构造函数
~CMyPlayerControl(); //析构函数
public:
BOOL Open(LPCSTR lpFileName); //打开文件
void Play(); //播放
void Close(); //关闭
void Stop(); //停止
void Pause(); //暂停
DWORD GetLength(DWORD dwItem); //得到歌曲长度
void SetWindowsHwnd(HWND hWnd);//设置主窗口句柄
private:
MCI_OPEN_PARMS mciOpen; //打开设备参数
HWND m_hwnd; //主窗口句柄
DWORD dwFrom; //播放起始点
};
#endif
// MyPlayerControl.cpp:
#include "stdafx.h"
#include "MyPlayerControl.h"
DWORD CMyPlayerControl::GetLength(DWORD dwItem)
{
//得到当前文件状态
MCI_STATUS_PARMS mcistatusparms;
mcistatusparms.dwCallback=(DWORD)m_hwnd;
mcistatusparms.dwItem=dwItem; //状态类别值
mcistatusparms.dwReturn=0;
mciSendCommand(mciOpen.wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);
return mcistatusparms.dwReturn; //返回长度
}
BOOL CMyPlayerControl::Open(LPCSTR lpFileName)
{
//如果有打开的MCI设备就关闭
if(mciOpen.wDeviceID)
Close();
mciOpen.lpstrDeviceType=NULL;
//播放文件路径
mciOpen.lpstrElementName=lpFileName;
//向MCI设备发送命令消息(在打开设备时,设备号为0)
if(mciSendCommand(0,MCI_OPEN,MCI_DEVTYPE_WAVEFORM_AUDIO,(DWORD)&mciOpen))
{
return FALSE;
}
dwFrom=MCI_MAKE_HMS(0,0,0); //起始位置为0
return TRUE;
}
void CMyPlayerControl::Play()
{
//播放参数结构
MCI_PLAY_PARMS mciplayparms;
//得到文件大小
DWORD cdlen=GetLength(MCI_STATUS_LENGTH);
DWORD cdto=MCI_MAKE_HMS(MCI_HMS_HOUR(cdlen),MCI_HMS_MINUTE(cdlen),MCI_HMS_SECOND(cdlen)); //把文件中读出的大小转换为时间数量
mciplayparms.dwCallback=NULL;
mciplayparms.dwFrom=dwFrom; //设置起始位置
mciplayparms.dwTo=cdto; //设置终止位置
if(mciOpen.wDeviceID!=0)
{//播放音乐
mciSendCommand(mciOpen.wDeviceID,MCI_PLAY,MCI_TO|MCI_FROM,(DWORD)(LPVOID)& mciplayparms);
}
}
void CMyPlayerControl::Close()
{
if(mciOpen.wDeviceID)
{//执行MCI_CLOSE操作,关闭MCI设备
mciSendCommand(mciOpen.wDeviceID,MCI_CLOSE,NULL,NULL);
}
}
void CMyPlayerControl::Stop()
{
if(mciOpen.wDeviceID)
{//执行MCI_STOPE操作,关闭MCI设备
mciSendCommand(mciOpen.wDeviceID,MCI_STOP,NULL,NULL);
//把播放位置设定为音乐文件的开头(使下一次播放操作从文件开头位置开始)
mciSendCommand(mciOpen.wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL);
}
dwFrom = MCI_MAKE_HMS(0,0,0); //把起始位置设为0
}
void CMyPlayerControl::Pause()
{
if(mciOpen.wDeviceID)
{
//执行MCI_PAUSE操作,暂停播放音乐
DWORD dwsf=GetLength(MCI_STATUS_POSITION);
dwFrom=MCI_MAKE_MSF(MCI_MSF_MINUTE(dwsf),MCI_MSF_SECOND(dwsf),MCI_MSF_FRAME(dwsf));
mciSendCommand(mciOpen.wDeviceID,MCI_PAUSE,NULL,NULL);
}
}
void CMyPlayerControl::SetWindowsHwnd(HWND hWnd)
{
m_hwnd=hWnd;
}
//CMyPlayerDlg.h
#if !defined(AFX_MYPLAYERDLG_H__131E9CFF_D65C_4B0D_A0D0_3ED8CA96D43E__INCLUDED_)
#define AFX_MYPLAYERDLG_H__131E9CFF_D65C_4B0D_A0D0_3ED8CA96D43E__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// CMyPlayerDlg dialog
#include"MyPlayerControl.h"
class CMyPlayerDlg : public CDialog
{
// Construction
public:
CMyPlayerDlg(CWnd* pParent = NULL);// standard constructor
// Dialog Data
//{{AFX_DATA(CMyPlayerDlg)
enum { IDD = IDD_MYPLAYER_DIALOG };
CSliderCtrl m_process; //滑动条对象
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CMyPlayerDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
private:
CMyPlayerControl m_myPlay; //类对象
CString m_strFileName; //打开文件路径
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CMyPlayerDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
virtual void OnOK(); //单击回车键响应
virtual void OnCancel(); //按下Esc键时响应,退出
afx_msg void OnPlayBin(); //播放按钮响应
afx_msg void OnPauseBin(); //暂停按钮响应
afx_msg void OnOpenBin(); //打开按钮响应
afx_msg void OnStopBin(); //停止按钮响应
afx_msg void OnTimer(UINT nIDEvent);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//CMyPlayerDlg.cpp
CMyPlayerDlg::CMyPlayerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyPlayerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyPlayerDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
BEGIN_MESSAGE_MAP(CMyPlayerDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_PLAY_BIN, OnPlayBin)
ON_BN_CLICKED(IDC_PAUSE_BIN, OnPauseBin)
ON_BN_CLICKED(IDC_OPEN_BIN, OnOpenBin)
ON_BN_CLICKED(IDC_STOP_BIN, OnStopBin)
ON_WM_TIMER()
END_MESSAGE_MAP()
void CMyPlayerDlg::OnPlayBin()
{
// TODO: Add your control notification handler code here
DWORD cdlen=m_myPlay.GetLength(MCI_STATUS_LENGTH); //得到曲目长度
m_myPlay.Play(); //调用播放
m_process.SetRange(0,cdlen); //设置进度条位置
SetTimer(0,1000,NULL); //设置定时器
}
void CMyPlayerDlg::OnPauseBin()
{
// TODO: Add your control notification handler code here
m_myPlay.Pause();
}
void CMyPlayerDlg::OnStopBin()
{
// TODO: Add your control notification handler code here
m_myPlay.Stop();
m_process.SetPos(0); //设置进度条位置
KillTimer(0); //关闭定时器
}
void CMyPlayerDlg::OnOpenBin()
{
// TODO: Add your control notification handler code here
CString strFileter("MP3 File (*.mp3)|*.mp3||");
CFileDialog OpenDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strFileter);
int nFlags=OpenDlg.DoModal();
if(nFlags==IDOK)
{
//用户单击的是“打开”按钮,将文件路径名赋给成员变量m_strFileName备用
m_strFileName=OpenDlg.GetPathName();
//打开MCI设备,并将设备分配给选中的文件使用
m_myPlay.Open(m_strFileName);
}
}
void CMyPlayerDlg::OnOK()
{
CDialog::OnOK();
}
void CMyPlayerDlg::OnCancel()
{
CDialog::OnCancel();
}
void CMyPlayerDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
//每秒得到的当前播放速度
DWORD cdf=m_myPlay.GetLength(MCI_STATUS_POSITION);
m_process.SetPos(cdf); //调用进度条位置
CDialog::OnTimer(nIDEvent);
}
编译后,当响应函数OnPlayBin和OnStopBin时,VC6.0的错误是:
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!
Program: E:\MyProjects\MyPlayer\Debug\MyPlayer.exe
File: afxcmn.inl
Line: 394
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
---------------------------
终止(A) 重试(R) 忽略(I)
---------------------------
这是为什么?如何解决?
[解决办法]
程序崩溃时,查看调用堆栈,很可能问题在你写的CMyPlayerControl类里
[解决办法]
你有没有窗口之间的调用啊?如果有的话,把父窗口调用及显示子窗口的代码,放在INIT中。