// MusicDlg.cpp : 实现文件
//#include "stdafx.h"
#include "Music.h"
#include "MusicDlg.h"
#include "MMsystem.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialog
{
public:
CAboutDlg();// 对话框数据
enum { IDD = IDD_ABOUTBOX }; protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持// 实现
protected:
DECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CMusicDlg 对话框
CMusicDlg::CMusicDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMusicDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMusicDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}BEGIN_MESSAGE_MAP(CMusicDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, &CMusicDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CMusicDlg 消息处理程序BOOL CMusicDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
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);
}
} // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
//  执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}void CMusicDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。void CMusicDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CMusicDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CMusicDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
mciSendString(L"play c:\\1.mp3",L"",0,NULL);}编译错误
1>------ 已启动生成: 项目: Music, 配置: Debug Win32 ------
1>正在链接...
1>MusicDlg.obj : error LNK2019: 无法解析的外部符号 __imp__mciSendStringW@16,该符号在函数 "public: void __thiscall CMusicDlg::OnBnClickedButton1(void)" (?OnBnClickedButton1@CMusicDlg@@QAEXXZ) 中被引用
1>C:\Users\Administrator\Desktop\Music\Debug\Music.exe : fatal error LNK1120: 1 个无法解析的外部命令
如何改正???

解决方案 »

  1.   

    1》project  setting->link->object/lib modules:
    “winmm.lib”
    2> #pragma comment (lib, "winmm.lib")      /* link with Windows MultiMedia lib */
      

  2.   

    链接好了 但怎么会出现  Music.exe 中的 0x7579b916 处未处理的异常: 0xC0000005: 写入位置 0x0041bdec 时发生访问冲突 这个错误 ???
      

  3.   

    难道我这句写错了吗?
     mciSendString(L"play c:\\1.mp3",L"",0,NULL);
      

  4.   

    我就写了一句代码
     mciSendString(L"play c:\\1.mp3",L"",0,NULL);
    现在这段代码有问题
      

  5.   

    参考:
    DWORD CWave::Play(CWnd* pWnd,LPCSTR pFileName)
    {
        MCI_OPEN_PARMS mciOpenParms;
        //initialize structure
        memset(&mciOpenParms,0,sizeof(MCI_OPEN_PARMS));// mciOpenParms.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_SEQUENCER;//MIDI类型
    // mciOpenParms.lpstrDeviceType = (LPCSTR)MCI_DEVTYPE_WAVEFORM_AUDIO;
        //set the file name to be played
        mciOpenParms.lpstrElementName=pFileName;    //first open the device
        DWORD dwResult=mciSendCommand(m_nDeviceID,MCI_OPEN,
      MCI_OPEN_ELEMENT,(DWORD)(LPVOID)&mciOpenParms);    //display error message if failed
        if(dwResult)
    {
            DisplayErrorMsg(dwResult);
    }
        else //if successful,instruct the device to play the WAV file
        {
            //save element indentifier
            m_nElementID=mciOpenParms.wDeviceID;        MCI_PLAY_PARMS mciPlayParms;        //set the window that will receive notification message
            mciPlayParms.dwCallback=(DWORD)pWnd->m_hWnd;        //instruct device to play file
            dwResult=mciSendCommand(m_nElementID,MCI_PLAY,MCI_NOTIFY,(DWORD)(LPVOID)&mciPlayParms);        //display error and close element if failed
            if(dwResult)
            {
                DisplayErrorMsg(dwResult);
                Stop();
            }
        }
        //return result of MCI operation
        return dwResult;
    }