大変、邪道なやり方です。以下のやりかたでどうにかできると思うのですが・・・ 実際はOnNewDocumentの時にCreteFileterGraphをするはずなのですが・・・。 あとDirectMediaを入れなければ以下のコードをコンパイル使用としてもエラーがでます。 DirectMediaは以下のURLから探してください http://www.microsoft.com/japan/directx/default.asp 使用変数関数一覧 HANDLE m_hGraphNotifyEvent; IGraphBuilder *m_pGraph; BOOL CreateFilterGraph(); void DeleteFilterGraph(); BOOL LoadMp3File(LPSTR FileName); CHAR Mp3LoadFileName[_MAX_PATH]; INT NowMp3Play; BOOL CheckStopMp3File(); BOOL StopMp3File(); //初期化 CDwDoc::CDwDoc() { m_pGraph=NULL; m_hGraphNotifyEvent=NULL; lpThisDoc=this; Mp3LoadFileName[0]='\0'; NowMp3Play=0; CreateFilterGraph(); } //消す CDwDoc::~CDwDoc() { DeleteFilterGraph(); } //Active Movieの初期化?? BOOL CDwDoc::CreateFilterGraph() { HRESULT hr;// return code ASSERT(m_pGraph == NULL); hr = CoCreateInstance(CLSID_FilterGraph, // get this documents graph object NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **) &m_pGraph); if(FAILED(hr)) { m_pGraph = NULL; return FALSE; } IMediaEvent *pME; hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **) &pME); if (FAILED(hr)) { DeleteFilterGraph(); return FALSE; } hr = pME->GetEventHandle((OAEVENT*) &m_hGraphNotifyEvent); pME->Release(); if (FAILED(hr)) { DeleteFilterGraph(); return FALSE; } return TRUE; } void CDwDoc::DeleteFilterGraph() { if(m_pGraph!=NULL) { m_pGraph->Release(); m_pGraph = NULL; } } //再生開始 BOOL CDwDoc::LoadMp3File(LPSTR FileName) { if(strlen(FileName)==0) { return FALSE; } DeleteFilterGraph(); if(!CreateFilterGraph()) { return FALSE; } HRESULT hr; WCHAR wPath[MAX_PATH]; MultiByteToWideChar( CP_ACP, 0, FileName,-1, wPath, MAX_PATH ); hr=m_pGraph->RenderFile(wPath, NULL); if (FAILED(hr) ) { return FALSE; } IMediaControl *pMC; hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **) &pMC); if( SUCCEEDED(hr) ) { IMediaPosition * pMP; hr = m_pGraph->QueryInterface(IID_IMediaPosition, (void**) &pMP); if (SUCCEEDED(hr)) { REFTIME tCurrent, tLength; hr = pMP->get_Duration(&tLength); if(SUCCEEDED(hr)) { hr = pMP->get_CurrentPosition(&tCurrent); if (SUCCEEDED(hr)) { if((tLength - tCurrent) < 1) { pMP->put_CurrentPosition(0); } } } pMP->Release(); } hr = pMC->Run(); pMC->Release(); if( SUCCEEDED(hr) ) { NowMp3Play=1; return TRUE; } } return FALSE; } //停止状態のチェック BOOL CDwDoc::CheckStopMp3File() { if(!NowMp3Play) { return TRUE; } IMediaEvent *pME; long lEventCode, lParam1, lParam2; if( SUCCEEDED(m_pGraph->QueryInterface(IID_IMediaEvent, (void **) &pME))) { if( SUCCEEDED(pME->GetEvent(&lEventCode, &lParam1, &lParam2, 0))) { HRESULT hrTmp = pME->FreeEventParams(lEventCode, lParam1, lParam2); ASSERT(SUCCEEDED(hrTmp)); if (lEventCode == EC_COMPLETE) { StopMp3File(); NowMp3Play=0; return TRUE; } else if((lEventCode==EC_ERRORABORT)||(lEventCode == EC_USERABORT)) { StopMp3File(); NowMp3Play=0; return TRUE; } } pME->Release(); } return FALSE; } //演奏の停止 BOOL CDwDoc::StopMp3File() { HRESULT hr; if(!NowMp3Play) return TRUE; IMediaControl *pMC; hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **) &pMC); if( SUCCEEDED(hr) ) { pMC->Stop(); pMC->Release(); NowMp3Play=0; return TRUE; } return TRUE; }