Неуправляемый дескриптор в C #, мне нужно освободить или уничтожить? - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть некоторый код C #, который используется в приложении win32 через ComInterop, он встроен как OleControl.

В моем приложении win32 я отправляю через дескриптор содержащее окно для элемента управления C # (код приложения win32):

oControl:ShowPreview(5, 3, INT(_CAST, SELF:Handle(0)))

В своем коде на C # я взял это и сохранил в IntPtr (код C #):

private IntPtr _parentWindowPtr;

public int ShowPreview(int someVar1, int someVar2, int parent)
{
    ...
    _parentWindowPtr = new IntPtr(parent);
    ...
}

Должен ли я выпускать или уничтожать IntPtr в коде C #?

1 Ответ

0 голосов
/ 27 апреля 2018

Это краткое изложение моего комментария выше


Должен ли я выпускать или уничтожать IntPtr в коде C #?

Проще говоря, вы должны не выпускать дескрипторы окон при работе с Ole / COM. Элементы управления Ole / COM ActiveX могут рассматриваться как абстракция пользовательского интерфейса более высокого уровня (включающая протоколы вдоль IOleControl; IOleControlSite) над простыми окнами. Вместо освобождения дескрипторов окна вы выпускаете COM-ссылки , что в конечном итоге приводит к разрушению окна и освобождению дескриптора.

В вашем конкретном случае вы проходите через дескриптор собственного окна к своему элементу управления COM, чтобы встроиться в него. Рекомендуется, чтобы вызывающий процесс (нативный exe) владел содержащим окном, поэтому элемент управления COM не должен брать на себя уничтожение контейнера.

Как освободить COM-объект в c #

Напоминаем, что для освобождения COM-объектов в c # рекомендуется:

Marshal.ReleaseComObject(someComObject);

Диаграмма Excel, встроенная в Microsoft Word, не закрывает Word.

Скажи мне больше

...