как обрабатывать события: массив элементов управления c Sharp (старый элемент управления com) - PullRequest
2 голосов
/ 18 августа 2011

Я пытаюсь работать со старым com-элементом управления (массивом элементов управления), следующие образцы: 5435293 , 39541 , 5497403 , 5738092 объясните (или, по крайней мере, насколько я понимаю), как обрабатывать события массивов элементов управления с помощью элементов управления .net, чтобы они имели Sender и EventArgs.

Мой вопрос будет таким: Как вы можете обрабатывать события старого управляющего массива com? .

EDIT: Массив будет создан динамически при запуске, например: В. Сколько соединений вы хотите? А. 5

Пример: элемент управления имеет это событие: control_connected (состояние int, описание строки)

Я могу создать некоторую функцию с теми же аргументами и назначить ее подключенному событию, но я не могу понять, как это сделать с массивом элементов управления.

Ты так много за помощь, и извините за дерьмовый английский ... Я не говорящий по-английски

1 Ответ

1 голос
/ 18 августа 2011

COM-события имеют другой модальный режим, у вас нет одного обработчика на событие, у вас есть объект приемника событий, который перехватывает каждое событие, которое COM-сервер планирует вызвать. Если вы просто подключите события ActiveX к делегатам, будут созданы RCW-файлы приемника событий , которые могут позже вызвать сбой , поэтому я предполагаю, что вы создаете свой собственный класс приемников событий.

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

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

Что-то вроде

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[TypeLibType(TypeLibTypeFlags.FHidden)]
[Guid("eventGuid")]
[CLSCompliant(false)]
public interface IEvent
{       
   [DispId(123)]
   void control_connected(int status, string description);
}
public class EventSink:IEvent
{
   object control;
   public EventSink (object control)
   {
        this.control=control;
   }  
   public event EventHandler<ControlConnectedEventArgs> ControlConnected;
   void control_connected(int status, string description);
   {
       EventHandler<ControlConnectedEventArgs> temp=this.ControlConnected;
       if(temp!=null)
           temp(this.control, new ControlConnectedEventArgs(status,description));
   }
}

Если у вас есть массив COM-серверов, просто объявите массив приемников событий, присоедините каждый приемник к каждому COM-серверу с помощью ConnectionPointCookie и подключите обработчики событий из приемника событий вместо COM-серверов. .

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