COM - .NET Interop - Winform из COM-клиента - PullRequest
0 голосов
/ 07 декабря 2009

У меня есть приложение .NET, содержащее WinForm. Эта WinForm содержит неуправляемый элемент управления ActiveX и несколько других элементов управления. Это приложение отлично работает в автономном режиме. Теперь мы хотим опубликовать некоторый интерфейс, чтобы эту Winform можно было использовать из неуправляемых приложений C ++ / MFC с использованием функциональных возможностей Interop. Клиентские приложения будут показывать эту форму в немодальном режиме. Когда пользователь вводит детали, они передаются клиенту с использованием метода источника / приемника COM-события (или точки подключения).

Я следил за различными статьями, и один из методов, который работает для нас, это http://codebetter.com/blogs/peter.van.ooijen/archive/2005/06/03/64041.aspx

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

Не могли бы вы сказать мне, как правильно представить функциональность WinForm для неуправляемых клиентских приложений через Interop?

Большое спасибо

Ответы [ 2 ]

1 голос
/ 07 декабря 2009

Вам необходимо настроить хост C ++ / MFC на использование модели потоков квартиры для COM-объекта форм C #. Это будет сериализовать все вызовы на прокси через оригинальный поток, который создал экземпляр COM-объекта. Вы также должны правильно распределить исходный интерфейс между вашими потоками в коде C ++ / MFC, используя CoMarshalInterThreadInterfaceInStream и CoGetInterfaceAndReleaseStream

1 голос
/ 07 декабря 2009

В статье, на которую вы ссылаетесь, содержится вся информация, необходимая для правильного размещения формы в неуправляемом приложении. Вы должны искать источник AV в другом месте. Начните с использования отладчика. Вы можете принудительно остановить исключение с помощью диалогового окна «Отладка + исключения», флажок «Брошено».

Требование STA почти всегда достаточно для правильной работы элемента управления ActiveX в многопоточном приложении. Это обеспечивает гарантию того, что все вызовы методов выполняются в том же потоке, в котором был создан класс. Другими словами, любые переменные экземпляра внутри реализации coclass гарантированно будут использоваться потокобезопасным способом.

Одна гарантия, которую вы здесь не имеете, заключается в том, правильно ли обрабатывает элемент управления глобальное состояние. Переменные экземпляра безопасны, глобальные переменные - нет, когда вы используете элемент управления в разных потоках. Возможный обходной путь для этого - использовать только один поток вместо одного потока STA для каждого экземпляра формы. Это немного сложно, вам понадобится невидимая вспомогательная форма, которая управляет потоком. Поддержание его и создание новых экземпляров форм с помощью метода Invoke ().

Прежде чем идти туда, выясните, что в первую очередь падает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...