我在做多媒体编程的过程中:
       我封装了一个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;
   }
}

解决方案 »

  1.   

    没有加相应的lib。
    在Project Setting->link中加。
      

  2.   

    加哪个Lib 呀!能说详细一点吗?
    是在对象/库模块 中添加吗?
      

  3.   

    大侠们厉害!我的OK了,
    能帮个忙,解释以下吗?
    为什么要加这个链,我上面的程序用到它了吗?
    为什么要在工程里面添加,在Caudio.cpp文件的上面引用winmm.lib头文件不行吗?
      

  4.   

    #pragma comment(lib, "winmm.lib"
      

  5.   

    .h文件只是给出了声明,在编译时需要将.h的二进制实现与生成执行文件的目标代码obj链接
    而mciSendCommand函数的二进制实现则包含在winmm.lib