Я пытаюсь встроить элемент управления WMP в свое приложение Win32.
Я следовал примеру кода здесь: Размещение элемента управления проигрывателя Windows Media в приложении Windows
Однако, когда я перехожу через этот пример, строка:
hr = spHost->CreateControl(CComBSTR(_T("{6BF52A52-394A-11d3-B153-00C04F79FAA6}")), m_wndView, 0);
возвращает E_NOINTERFACE;
Линия:
hr = m_wndView.QueryHost(&spHost);
успешно и, кажется, правильно заполняет spHost.
Вот код:
CAxWindow m_wndView;
CComPtr<IObjectWithSite> spHostObject;
CComPtr<IAxWinHostWindow> spHost;
CComBSTR classID = __uuidof(WindowsMediaPlayer);
RECT rcClient = { 0, 0, 560, 335 };
m_wndView.Create(m_hWnd, rcClient, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, WS_EX_CLIENTEDGE);
hr = m_wndView.QueryHost(&spHost);
if( SUCCEEDED(hr) )
{
hr = spHost->CreateControl(classID, m_wndView, 0); //E_NOINTERFACE
}
hr = m_wndView.QueryControl(&m_spPlayer); //E_FAIL
Кто-нибудь может дать мне представление о том, почему это происходит?
Благодарю.
редактировать: Строка, которая на самом деле терпит неудачу, это строка внутри функции ActivateAx ():
hr = m_spOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, spClientSite, 0, m_hWnd, &m_rcPos);
Если бы кто-то мог пролить больше света на это, это было бы здорово.
Edit2Я только что заметил, что получил это спам в моем окне вывода, пока я пошагово прошёл этот код:
«Исходящий вызов не может быть выполнен, поскольку приложение отправляет синхронный входной вызов«Есть идеи?
Код правильный и работает как есть, и как предложено на странице MSDN.
Проблема, как описано, может возникнуть, если ваше окно пользовательского интерфейса находится в квартире MTA, то есть поток, на котором вы работаете, был инициализирован CoInitializeEx(NULL, COINIT_MULTITHREADED)
,
Что происходит тогда, ваш WMP создается в стороннем STA-потоке, а его интерфейс маршалируется в ваш поток / квартиру. Не каждый требуемый интерфейс может быть передан таким образом, поэтому, как только вы продолжаете инициализировать его, некоторые из обязательных интерфейсов пропадают …
WMP использует модель потоков «Квартира», используйте ее на потоках STA.
Других решений пока нет …