Предоставление управляемых дескрипторов управления неуправляемому коду - нарушение прав доступа - PullRequest
1 голос
/ 01 сентября 2011

Итак, у меня есть этот SDK, предоставленный третьей стороной, который используется для просмотра потокового видео с удаленного источника.Удаленный источник запускает сервер, предоставленный третьей стороной, который захватывает и хранит видео, и я могу подключиться к этому серверу и получить видео через SDK.Я ссылаюсь на SDK через COM, и основные неграфические операции, такие как подключение к серверу, выбор видеопотока и т. Д., Работают нормально.

Проблема в том, что основной (единственный) метод для фактического показа видео впользователь, использующий этот SDK, должен передать hWnd (как int) в метод, который затем асинхронно закрасит видео в клиентскую область этого окна.«Окно» здесь, насколько мне известно, имеет значение окна GUI, которое в терминах .NET было бы любым элементом управления WinForms с дескриптором окна.В моем случае я использую элементы управления PictureBox (по одному на канал, который хочет видеть пользователь).

Проблема в том, что я, очевидно, не могу просто вставить дескриптор управляемого элемента управления PictureBox в этот метод SDK, потому что, когда я делаюпоэтому я получаю AccessViolationException от неуправляемого потока.Я работаю над примером программы, написанной на VB 6 (которая работает на моем компьютере с тестовым сервером), которая делает то же самое с VB PictureBox, и это работает просто отлично, но, очевидно, что бы ни пытался сделать SDK, чтобынаша классная безопасная песочница .NET не летает с CLR.

Помощь?Я хотел бы дать больше информации или пример кода, но я не могу предоставить что-либо достаточно продезинфицированное, чтобы это работало в общем случае, и я не могу разглашать используемый SDK.Я думаю, что мне нужно просто сказать .NET, что мой ссылочный код должен доверять тому, что он делает с окном, ИЛИ как-то перемещать окно в менее управляемое пространство памяти вне удобной песочницы моей программы.

РЕДАКТИРОВАТЬ: ОК, небольшой прогресс был достигнут.Сейчас я проверяю, что дескриптор для элемента управления был создан с помощью IsHandleCreated, прежде чем дать дескриптор метода.Однако, как сказал Ганс Пассант, IntPtr не является int.Итак, как мне поместить этот квадратный колышек в круглое отверстие?Я пробовал и функцию ToInt32 () и явное приведение к (int).Ни одна из них не работает, даже при компиляции моей библиотеки для 32-битной архитектуры.Вернусь ли я к третьей стороне и скажу, что их SDK - это POS, из-за которого я не могу пропустить указатель?

1 Ответ

5 голосов
/ 01 сентября 2011

Это должно работать нормально.Control.Handle для элемента управления форм Windows - это просто стандартный HWND из Windows API.Многие примеры DirectX используют именно эту технику.

При этом убедитесь, что это не передается в собственный код до тех пор, пока не будет создан элемент управления.Например, если вы передадите дескриптор во время конструктора формы (до загрузки), в этот момент дескриптор будет недействительным.

...