请教大虾关于bug:Access violation reading location
在Visual Studio 2008环境下,新建了一个MFC Application(基于SDI)的工程,名字为test1.主要任务:
通过在CTest1View类中增加一个CStatic控件,然后借助OpenCV(OpenCV1.0)来实现AVI格式视频的读取(XViD格式的AVI).在程
序中遇到这样的问题:如果让视频正常播放直到结束,点击框架窗口右上角的叉,程序正常关闭;但是如果视频还在播放就突然点击框架窗口右上角的叉,则会弹出模态对话框,提示这样的错误。
Unhandled exception at 0x05f398f4 in test1.exe: 0xC0000005: Access violation reading location 0x052d4e88。然后窗口显示一顿汇编指令。move ...啊?教教我把FC的新手。
下面我把自己的代码贴上来把。
一、在CTest1View.cpp中,
1.添加OpenCV的头文件
#include "cv.h"
#include "cvaux.h"
#include "cxcore.h"
#include "highgui.h"
2.新建结构体作为参数
typedef struct _PLAYVIDEO
{
HWND* hWnd;//播放视频的CStatic控件的窗口句柄
CString filename;//播放的文件名
}PLAYVIDEO;
PLAYVIDEO pv;//全局变量,可以在下面进行初始化并传递给播放视频的线程ThreadPlay;
3.声明用于播放的线程函数
DWORD WINAPI ThreadPlay(LPVOID lpParameter);
二、在CTest1View类中增加成员变量
protected:
CStatic m_staticVideo;
三、在CTest1View的OnCreate()中创建控件
if(!m_staticVideo.m_hWnd)
{
m_staticVideo.Create(_T(""),WS_CHILD | WS_VISIBLE,CRect(0,0,400,300),this);
}
else
{
m_staticVideo.ShowWindow(SW_SHOW);
}
四、在CTest1View中响应文件打开消息,添加如下代码:
CString szFilters("Avi Files(*.avi)|*.avi||");
CFileDialog dg(TRUE,_T("*.avi"),NULL,OFN_HIDEREADONLY,szFilters,this,0,1);
if(IDCANCEL==dg.DoModal())
{
return;
}
pv.filename=.GetFileName();
pv.hWnd=&(m_staticVideo.m_hWnd);
//创建线程
HANDLE h=CreateThread(NULL,0,ThreadPlay,&pv,CREATE_SUSPENDED,NULL);
SetThreadPriority(h,THREAD_PRIORITY_LOWEST);
ResumeThread(h);
五、然后是线程函数:
WORD WINAPI ThreadPlay(LPVOID lpParameter)
{
PLAYVIDEO *p=(PLAYVIDEO*)lpParameter;
HWND *pHwnd=p->hWnd;
CString strFilename=p->filename;
//将文件名由Unicode转为ASCII格式
char filename[1024];
memset(filename,0,1024);
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,strFilename,strFilename.GetLength(),filename,1024,NULL,NULL);
IplImage *pIplImage=NULL;
CvCapture *pCapture=NULL;
CvvImage cvvImage;
HDC hDC=::GetDC(*pHwnd);
CRect r(0,0,400,300);//CStatic控件的大小就是400*300
if(!(pCapture=cvCaptureFromFile(filename)))
{
AfxMessageBox(_T("Open failed"),MB_OK);
return 0;
}
while(pIplImage=cvQueryFrame(pCapture))
{
cvvImage.CopyOf(pIplImage);
cvvImage.DrawToHDC(hDC,&r);
cvWaitKey(20);
}
if(pCapture)
cvReleaseCapture(&pCapture);
if(pIplImage)
cvReleaseImage(&pIplImage);
ReleaseDC(*pHwnd,hDC);
return 0;
}
请问怎么办啊?