我在做多媒体编程的过程中:
我封装了一个Caudio的类(通过MCI函数来封装的),产生两个文件:Caudio.cpp Caudio1.h
在我用MFC编程中想调用这个类,把这两个文件放到各自的位置上!
再在对话框里引用以下Caudio1.h头文件,设置一个变量m_audio 为Caudio 类
出现以下情况:
程序编译通过
但程序Bulid不通过,出现下面两个错误!
Cvideo.obj : error LNK2001: unresolved external symbol __imp__mciSendCommandA@16
Debug/vcd.exe : fatal error LNK1120: 1 unresolved externals请高手救我!!!!!!!!!(下面是我封装的类,可以不了解!)
/***************************************Caudio.cpp****************************************
/************************************************************
/* Holy-Enterprise Software Class
/* Holy Develop Group
/* 封装Cvideo类 实现对视频文件的播放
/* Cvideo Member Function
/* Copy right Holy Enterprise
*************************************************************/
#include "stdafx.h"
#include "Cvideo1.h"
#include <mciavi.h>
#include <digitalv.h>
#include <afxwin.h>
#include <mmsystem.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endifCvideo::Cvideo()
{
//初始化成员变量
m_bOpened=FALSE;
m_bPaused=FALSE;
m_bPlaying=FALSE;
m_wDeviceID=0;
}Cvideo::~Cvideo()
{
Close();
}bool Cvideo::Open(CString FileName,CWnd *pWnd,int left,int top)
{
if (!m_bOpened) //判断是否打开视频文件文件
{
//初试化成员变量
m_bOpened=m_bPaused=m_bPlaying=FALSE;
m_wDeviceID=0;
//判断文件是否存在
CFileStatus Status;
if (!CFile::GetStatus(FileName,Status))
return FALSE;
//打开设备
MCI_DGV_OPEN_PARMS OpenParams;
OpenParams.lpstrDeviceType="avivideo";
OpenParams.lpstrElementName=(LPSTR)FileName.GetBuffer(0);
OpenParams.wDeviceID=0;
OpenParams.hWndParent=pWnd->m_hWnd;
OpenParams.dwStyle=WS_CHILD|WS_VISIBLE; if (mciSendCommand(NULL,MCI_OPEN,MCI_WAIT|MCI_OPEN_TYPE|MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT|MCI_DGV_OPEN_WS,(DWORD)(LPVOID)&OpenParams))
return FALSE;
m_wDeviceID=OpenParams.wDeviceID;
m_bOpened=TRUE;
//将文件长度设置为桢
MCI_DGV_SET_PARMS SetParms;
SetParms.dwFileFormat=MCI_FORMAT_FRAMES;
if (mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&SetParms))
{
Close();
return FALSE;
}
//找到视频开始的位置
mciSendCommand(m_wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL); //将播放画面置与主窗口之中 ...............重点部分
MCI_DGV_PUT_PARMS PutParms; //该命令是设置播放视频窗口
PutParms.rc.left=left;
PutParms.rc.top=top;
PutParms.rc.right=GetWidth();
PutParms.rc.bottom=GetHeight();
if (mciSendCommand(m_wDeviceID,MCI_PUT,MCI_WAIT|MCI_DGV_PUT_CLIENT|MCI_DGV_PUT_WINDOW|MCI_DGV_RECT,(DWORD)(LPVOID)&PutParms))
{
Close();
return FALSE;
}
}
else
{
AfxMessageBox("文件没打开,或者没有选择文件!");
return FALSE;
}
return TRUE;
}void Cvideo::Close(void)
{
if (m_bOpened)
{
//停止播放,关闭设备
if (m_bPaused||m_bPlaying)
mciSendCommand(m_wDeviceID,MCI_STOP,NULL,NULL);
mciSendCommand(m_wDeviceID,MCI_CLOSE,NULL,NULL);
//清空成员变量
m_bPaused=FALSE;
m_bOpened=FALSE;
m_bPlaying=FALSE;
m_wDeviceID=0;
}
}
void Cvideo::Stop(void)
{
if (m_bOpened && m_bPlaying)
{
mciSendCommand(m_wDeviceID,MCI_STOP,NULL,NULL);
mciSendCommand(m_wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL);
m_bPlaying=FALSE;
m_bPaused=FALSE;
}
}bool Cvideo::Play(bool bLoop,bool bFullScreen)
{
if (m_bOpened)
{
//如果是视频的尾部则重新播放
if(GetFramesed()>GetFrames())
mciSendCommand(m_wDeviceID,MCI_PLAY,MCI_SEEK_TO_START,NULL);
//播放 MCI_DGV_PLAY_PARMS PlayParms;
PlayParms.dwCallback=NULL;
PlayParms.dwFrom=GetFramesed();
DWORD dwFlags=MCI_FROM;
/* if (bLoop)
dwFlags!=MCI_DGV_PLAY_REPEAT;
if (bFullScreen)
dwFlags!=MCI_MCIAVI_PLAY_FULLSCREEN;*/
if (mciSendCommand(m_wDeviceID,MCI_PLAY,dwFlags,(DWORD)(LPVOID)&PlayParms))
return FALSE;
m_bPaused=FALSE;
m_bPlaying=TRUE;
return TRUE;
}
return FALSE;
}void Cvideo::Pause(void)
{
if (m_bOpened && m_bPlaying)
{
MCI_PLAY_PARMS PlayParms;
if (mciSendCommand(m_wDeviceID,MCI_PAUSE,0,(DWORD)(LPVOID)&PlayParms))
return;
m_bPaused=TRUE;
}
}
我封装了一个Caudio的类(通过MCI函数来封装的),产生两个文件:Caudio.cpp Caudio1.h
在我用MFC编程中想调用这个类,把这两个文件放到各自的位置上!
再在对话框里引用以下Caudio1.h头文件,设置一个变量m_audio 为Caudio 类
出现以下情况:
程序编译通过
但程序Bulid不通过,出现下面两个错误!
Cvideo.obj : error LNK2001: unresolved external symbol __imp__mciSendCommandA@16
Debug/vcd.exe : fatal error LNK1120: 1 unresolved externals请高手救我!!!!!!!!!(下面是我封装的类,可以不了解!)
/***************************************Caudio.cpp****************************************
/************************************************************
/* Holy-Enterprise Software Class
/* Holy Develop Group
/* 封装Cvideo类 实现对视频文件的播放
/* Cvideo Member Function
/* Copy right Holy Enterprise
*************************************************************/
#include "stdafx.h"
#include "Cvideo1.h"
#include <mciavi.h>
#include <digitalv.h>
#include <afxwin.h>
#include <mmsystem.h>#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endifCvideo::Cvideo()
{
//初始化成员变量
m_bOpened=FALSE;
m_bPaused=FALSE;
m_bPlaying=FALSE;
m_wDeviceID=0;
}Cvideo::~Cvideo()
{
Close();
}bool Cvideo::Open(CString FileName,CWnd *pWnd,int left,int top)
{
if (!m_bOpened) //判断是否打开视频文件文件
{
//初试化成员变量
m_bOpened=m_bPaused=m_bPlaying=FALSE;
m_wDeviceID=0;
//判断文件是否存在
CFileStatus Status;
if (!CFile::GetStatus(FileName,Status))
return FALSE;
//打开设备
MCI_DGV_OPEN_PARMS OpenParams;
OpenParams.lpstrDeviceType="avivideo";
OpenParams.lpstrElementName=(LPSTR)FileName.GetBuffer(0);
OpenParams.wDeviceID=0;
OpenParams.hWndParent=pWnd->m_hWnd;
OpenParams.dwStyle=WS_CHILD|WS_VISIBLE; if (mciSendCommand(NULL,MCI_OPEN,MCI_WAIT|MCI_OPEN_TYPE|MCI_OPEN_ELEMENT|MCI_DGV_OPEN_PARENT|MCI_DGV_OPEN_WS,(DWORD)(LPVOID)&OpenParams))
return FALSE;
m_wDeviceID=OpenParams.wDeviceID;
m_bOpened=TRUE;
//将文件长度设置为桢
MCI_DGV_SET_PARMS SetParms;
SetParms.dwFileFormat=MCI_FORMAT_FRAMES;
if (mciSendCommand(m_wDeviceID,MCI_SET,MCI_SET_TIME_FORMAT,(DWORD)(LPVOID)&SetParms))
{
Close();
return FALSE;
}
//找到视频开始的位置
mciSendCommand(m_wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL); //将播放画面置与主窗口之中 ...............重点部分
MCI_DGV_PUT_PARMS PutParms; //该命令是设置播放视频窗口
PutParms.rc.left=left;
PutParms.rc.top=top;
PutParms.rc.right=GetWidth();
PutParms.rc.bottom=GetHeight();
if (mciSendCommand(m_wDeviceID,MCI_PUT,MCI_WAIT|MCI_DGV_PUT_CLIENT|MCI_DGV_PUT_WINDOW|MCI_DGV_RECT,(DWORD)(LPVOID)&PutParms))
{
Close();
return FALSE;
}
}
else
{
AfxMessageBox("文件没打开,或者没有选择文件!");
return FALSE;
}
return TRUE;
}void Cvideo::Close(void)
{
if (m_bOpened)
{
//停止播放,关闭设备
if (m_bPaused||m_bPlaying)
mciSendCommand(m_wDeviceID,MCI_STOP,NULL,NULL);
mciSendCommand(m_wDeviceID,MCI_CLOSE,NULL,NULL);
//清空成员变量
m_bPaused=FALSE;
m_bOpened=FALSE;
m_bPlaying=FALSE;
m_wDeviceID=0;
}
}
void Cvideo::Stop(void)
{
if (m_bOpened && m_bPlaying)
{
mciSendCommand(m_wDeviceID,MCI_STOP,NULL,NULL);
mciSendCommand(m_wDeviceID,MCI_SEEK,MCI_SEEK_TO_START,NULL);
m_bPlaying=FALSE;
m_bPaused=FALSE;
}
}bool Cvideo::Play(bool bLoop,bool bFullScreen)
{
if (m_bOpened)
{
//如果是视频的尾部则重新播放
if(GetFramesed()>GetFrames())
mciSendCommand(m_wDeviceID,MCI_PLAY,MCI_SEEK_TO_START,NULL);
//播放 MCI_DGV_PLAY_PARMS PlayParms;
PlayParms.dwCallback=NULL;
PlayParms.dwFrom=GetFramesed();
DWORD dwFlags=MCI_FROM;
/* if (bLoop)
dwFlags!=MCI_DGV_PLAY_REPEAT;
if (bFullScreen)
dwFlags!=MCI_MCIAVI_PLAY_FULLSCREEN;*/
if (mciSendCommand(m_wDeviceID,MCI_PLAY,dwFlags,(DWORD)(LPVOID)&PlayParms))
return FALSE;
m_bPaused=FALSE;
m_bPlaying=TRUE;
return TRUE;
}
return FALSE;
}void Cvideo::Pause(void)
{
if (m_bOpened && m_bPlaying)
{
MCI_PLAY_PARMS PlayParms;
if (mciSendCommand(m_wDeviceID,MCI_PAUSE,0,(DWORD)(LPVOID)&PlayParms))
return;
m_bPaused=TRUE;
}
}
在Project Setting->link中加。
是在对象/库模块 中添加吗?
能帮个忙,解释以下吗?
为什么要加这个链,我上面的程序用到它了吗?
为什么要在工程里面添加,在Caudio.cpp文件的上面引用winmm.lib头文件不行吗?
而mciSendCommand函数的二进制实现则包含在winmm.lib