Я немного погорячился: WMP закладывает в рот (ROT - Running Object Table) не IMoniker->IFilterGraph, а IMoniker->IMediaPlayer и др. Я потратил вечерок и нашел решение (если надо, могу намылить весь проект - сообщите
um@aport2000.ru):
P.S. Кстати, можно не только просматривать свойства, но и активно управлять объектами WMP, вызывая методы в соответствии с выбранными интерфейсами.
// MSVC 6.0
#import "msdxm.ocx"
void CSpyWMPDoc::ScanMediaPlayers()
{
using namespace MediaPlayer;
IRunningObjectTable *pROT;
HRESULT hr = GetRunningObjectTable(0, &pROT);
if (FAILED(hr))
return;
IEnumMoniker *penum;
pROT->EnumRunning(&penum);
ULONG cFetched = 0;
IMoniker *pM;
char achFriendlyName[255];
while(penum->Next(1, &pM, &cFetched), cFetched>0) {
WCHAR* sole;
IBindCtx *pbc;
CreateBindCtx(0,&pbc);
pM->GetDisplayName(pbc,0,(LPOLESTR*)&sole);
pbc->Release();
sprintf(achFriendlyName,"%S",sole);
// псевдоним приложения в ROT
CoTaskMemFree(sole);
IUnknown *pUnk;
hr = pROT->GetObject(pM,&pUnk);
if (SUCCEEDED(hr)){
IMediaPlayer* pmp;
hr = pUnk->QueryInterface(__uuidof(IMediaPlayer), (void **)&pmp);
if (!FAILED(hr)){
CoLockObjectExternal(pmp,true,false); // lock
AddToList(achFriendlyName,pmp->FileName);
CoLockObjectExternal(pmp,false,false); // unlock
// pmp->Release();
} else {
AddToList(achFriendlyName,"приложение - не WMP !!! - для отладки");
}
pUnk->Release();
}
pM->Release();
}
penum->Release();
pROT->Release();
}
void CSpyWMPDoc::AddToList(char *appname,char *filename)
{
CListView* pview =
(CListView*)((CFrameWnd*)AfxGetMainWnd())->GetActiveView();
CListCtrl &ctrl = pview->GetListCtrl();
int row = ctrl.InsertItem(0x7FFFFFFF,"");
ctrl.SetItemText(row,0,appname);
ctrl.SetItemText(row,1,filename);
}