Как VB6 может предотвратить доставку событий COM (.net -> VB6 через COM)? - PullRequest
2 голосов
/ 11 марта 2011

Итак, я пишу компонент в C # с событиями, которые нужно представить через COM для VB6.

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

Однако, что-то в механизме приложения означает, что иногда COM-события не доставляются (когда несколько событий срабатывают в тесной последовательности, только первое проходит). Я попал на стадию трассировки данных непосредственно перед тем, как они возникли как событие на стороне .net, и сразу после того, как они обработаны на стороне VB. Они не просто ставятся в очередь или передаются не по порядку (будет (более) приемлемо), они поднимаются, но не принимаются. Все события создаются из одного потока .net. Когда я перехожу через код, все они доставляются правильно; в тестовом приложении «голые кости» все они доставляются даже «на скорости».

Таким образом, некоторая другая часть приложения VB, по-видимому, препятствует доставке этих событий. С чего мне начать искать? Может ли DoEvents иметь непреднамеренные побочные эффекты, например?

РЕДАКТИРОВАТЬ: уточнил выше, что только первая партия проходит.

РЕДАКТИРОВАТЬ: пересмотренный случай (изначально считалось, что проблема с оберткой COM)

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Ваш код VB6, скорее всего, работает в квартире, поэтому он должен запустить насос сообщений для принятия входящих событий.Ваш .Net-объект вызовет событие COM, это отправит сообщение в квартиру вашего VB6 и обработает сообщение.Если подсистема COM использует SendMessageTimeout, то возможно, что вызванные события отбрасываются, потому что ваш код VB6 слишком медленный для их обработки - но обычно вы получаете сообщение об ошибке, что удаленный клиент недоступен, если что-то связывают.В общем, это хорошая идея сделать абсолютный минимум в обработчике событий COM.Как правило, это означает поднять ваше собственное событие или опубликовать свои собственные сообщения для себя.Это предотвращает связывание потока удаленных клиентов.Поэтому я бы предложил ограничить ваш обработчик событий простым вызовом RaiseEvent для нового события, определенного в вашем коде VB6.Убедитесь, что остальная часть вашего VB6 ориентирована на события, и все должно работать нормально.

1 голос
/ 18 марта 2011

Итак, через 6 дней отладки я пришел к решению: события COM просто сгруппированы и не доставляются, когда вы находитесь в точке останова в режиме отладки. То, что я видел, было комбинацией двух вещей:

  1. Основной цикл программирования, предполагаемый после первого события, он должен просто продолжать и делать свое дело; поэтому, когда позднее пришли другие события, мы больше не вызывали «DoEvents», чтобы разрешить им вход в основной поток; и они задержались до такой степени, что не имели значения.
  2. Все мои усилия по диагностике ситуации сводились к тому, что в какой-то момент я поставил точку останова в коде, чтобы увидеть, что происходит, / шаг за ней / добавил новый код в выходные переменные и т. Д. Если я находился в точке останова, когда событие было доставлено, событие было просто добавлено в очередь без очереди.

Надеюсь, это может спасти кого-то другого, тратящего столько времени на такую ​​глупую проблему ...

...