IAxWinHostWindow CreateControl возвращает E_NOINTERFACE при попытке разместить WMP в CAxWindow

Я пытаюсь встроить элемент управления 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Я только что заметил, что получил это спам в моем окне вывода, пока я пошагово прошёл этот код:

«Исходящий вызов не может быть выполнен, поскольку приложение отправляет синхронный входной вызов«Есть идеи?

2

Решение

Код правильный и работает как есть, и как предложено на странице MSDN.

Проблема, как описано, может возникнуть, если ваше окно пользовательского интерфейса находится в квартире MTA, то есть поток, на котором вы работаете, был инициализирован CoInitializeEx(NULL, COINIT_MULTITHREADED),

Что происходит тогда, ваш WMP создается в стороннем STA-потоке, а его интерфейс маршалируется в ваш поток / квартиру. Не каждый требуемый интерфейс может быть передан таким образом, поэтому, как только вы продолжаете инициализировать его, некоторые из обязательных интерфейсов пропадают …

WMP использует модель потоков «Квартира», используйте ее на потоках STA.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]