Как передать ATL COM dll HWND элемента управления WPF

#wpf #com #atl #hwnd #ms-media-foundation

#wpf #com #atl #hwnd #ms-media-foundation

Вопрос:

У меня есть C ATL COM DLL (phew), который предоставляет класс VideoPlayer, который сам инкапсулирует вызовы Windows Media Foundation.

Я использую эту DLL из приложения WPF, в котором я хотел бы отобразить видео в элементе управления.

В моей DLL есть метод с именем Initialize, для которого требуется 2 HWND для MF.

Как я должен объявить эту функцию? Что я должен передать ему в приложении WPF?

На данный момент у меня есть:

VideoPlayer.h

 STDMETHOD(Initialize)(
    OLE_HANDLE video_hwnd, 
    OLE_HANDLE event_hwnd
    );
  

VideoPlayer.cpp

 STDMETHODIMP VideoPlayer::Initialize(
    OLE_HANDLE hVideo, 
    OLE_HANDLE hEvent
    )
{
    m_hwndVideo = (HWND) (DWORD_PTR)hVideo;
    m_hwndEvent = (HWND) (DWORD_PTR)hEvent;
}
  

Приложение WPF:

 private void Button_Click(object sender, RoutedEventArgs e)
{
    var handle = new WindowInteropHelper(this).Handle.ToInt32();
    videoPlayer = new EmideeMediaFoundationLib.VideoPlayer();

    videoPlayer.Initialize( handle, handle );
}
  

Я получаю правильные значения в функции инициализации, но преобразование в HWND завершается неудачей…

Есть идеи?

Заранее спасибо

Майк

Комментарии:

1. Рассмотрим, как интерфейсы IOleXXX обмениваются HWND. msdn.microsoft.com/en-us/library/windows/desktop /…

2. Довольно неясно, как выглядит сбой. Пока вы подключаете его к int32, вам лучше убедиться, что ваш проект нацелен на платформу x86.

3. На данный момент это только x86, но я планирую перенести его на x64 позже. Должен ли я вместо этого преобразовать его в Int64?