2011-01-20 3 views
3

У меня есть DLL (Player.dll), написанная на C++, которая внутренне использует Windows GDI. Я заявление (в основном видеоплеер), записанное в Windows Forms, что внутренне вызовы API, из Player.dll оказать фактические графики на экране, используя P/Invoke метод:Обращение к Silverlight UserControl

public class ProxyPlayer 
{ 
    [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PlayVideo")] 
    public static extern void Play(int playerHandle, out TWResult result); 

    [DllImport("Player.dll", CharSet=CharSet.Unicode, EntryPoint="PauseVideo")] 
    public static extern void Pause(int playerHandle); 

    //other methods 
} 

Это работает.

Но теперь я хочу написать одно приложение с помощью Silverlight 4.0. Как вы знаете, большинство Windows GDI работает с HWND, чтобы сделать графику на экране, поэтому я передаю playerHandle в ProxPlayer методам, как вы можете видеть выше самостоятельно. Window Forms 'UserControl определяет публичное свойство под названием Handle типа IntPtr, что эквивалентно HWND, поэтому я передаю это ProxyPlayer методам. Это решило мою проблему. Но у Silverlight UserControl нет такого свойства.

Итак, мой вопрос в основном заключается в том, как я могу обращаться с моим контроллером silverlight? Потому что без него я не могу вызывать API от Player.dll. Но я должен назвать APS. У меня нет других опций, , поскольку DLL - это настоящий движок, который буквально все связывает с , интерпретируя огромное количество данных, а затем их рендеринг. Поэтому, пожалуйста, предложите мне решение, которое соответствует моему требованию!

Примечание: Предположим, что приложение silverlight всегда будет работать в Microsoft Windows. Поэтому у меня нет проблем с выводом Windows GDI.

+1

Пользовательские элементы Silverlight не имеют дескриптора (аналогично WPF). В случае с WPF основные окна получают один, но даже это не так в Silverlight, где контент размещается каким-либо другим приложением (либо браузером, либо sllauncher). – Jens

+0

@Nawaz: вы когда-нибудь находили решение для своего проблема? Мне нужно будет сделать то же самое, что и вы! – Johannes

+0

@Johannes: Нет. Я не очень много пробовал, потому что у меня была простая альтернатива: я развернул свой плеер как таковой (например, приложение winform) и попросил пользователя загрузить его, чтобы воспроизвести видеофайлы. – Nawaz

ответ

2

Если вы можете открыть свою родную DLL в качестве COM-сервера, который реализует IDispatch, вы можете получить доступ к этому из Silverlight (через класс AutomationFactory), если вы находитесь в доверенном приложении на стороне браузера в Windows.

Я по-прежнему рекомендую (по моему комментарию к даринскому ответу), что вы хорошо смотрите на платформу, поскольку ваш пример «PlayVideo»/«PauseVideo» предлагает вам делать то, что может уже сделать платформа, и еще лучше, платформа может делать это на MacOS и в браузере и без уродства писать собственный COM-сервер и так далее.

5

Я DLL (Player.dll) написана на C++, который внутренне использует win32 API

Вы можете просто забыть о PInvoking во что-то вроде этого с помощью Silverlight. Silverlight предназначался для запуска кросс-браузера/платформы. Представьте себе свой код под MacOS. Поэтому сконцентрируйте свою энергию на поиске управляемого эквивалента этого кода, который может запускаться из Silverlight или вы просто теряете время.

+0

@Darin: Я обновил свой вопрос. См. ** «Примечание» ** внизу! – Nawaz

+1

+1 - Silverlight уже предоставляет множество медиа-поддержки (см. Элемент управления MediaElement) - так почему вы хотите больше общаться с HWND?Особенно в кроссплатформенном плагине? Silverlight может даже выполнять аппаратное ускорение некоторых вещей, используя DirectX или OpenGL (в зависимости от платформы), которые будут превосходить рендеринг на основе HWND. Почему бы не позволить платформе делать то, что она делает лучше всего и что-то делать? –

+0

@Austin: На самом деле мне нужно вызвать методы из DLL, для этого мне нужно обработать окно. У меня нет других вариантов. C++ DLL - это реальный движок, который делает буквально все, что связано с рендерингом. У вас есть решение для этого? – Nawaz

Смежные вопросы