Ну, я продвинулся намного дальше с этим, но я, кажется, столкнулся с неразрешимой проблемой.
Заменяемый объект использует события COM.Когда одно из клиентских приложений (я полагаю, VB6, поскольку depends.exe
сообщает мне, что оно использует msvbvm60.dll
) создает и использует мою замену, оно не регистрируется ни для одного из событий, и, к сожалению, работает так, что послевызов конкретного метода завершен, клиентское приложение ничего не делает до тех пор, пока не сработает событие.
Примечание: Мой заменяющий элемент управления ActiveX наследуется от System.Windows.Forms.Control
и устанавливает MiscOptions 131457
для коклассазаписи реестра в соответствии с предложением http://ondotnet.com/pub/a/dotnet/2003/01/20/winformshosting.html,, причина в том, что заменяемая вещь была честным и добрым элементом управления ActiveX, и я не мог заставить этих существующих клиентов успешно создать экземпляр моего объекта без каких-либо изменений кода, пока я не унаследовализ элемента управления WinForms.
Я пробовал подход, в котором мой coclass объявляет публичные события с тем же именем, что и интерфейс, заданный ComSourceInterfaces
, это работает на 100% из приложения C #, использующего AxHost, события инициируются.
Я также попытался реализовать IConnectionPointContainer
aи все поддерживающие интерфейсы на моем контроле замены, и это работает на 100% из приложения C #, но в приложении VB оно фактически никогда не пытается Advise()
вызвать точку подключения интерфейса приемника клиента, оно только вызывает Unadvise()
с недопустимым значением cookie равным 0.
Одна проблема с библиотекой типов, которую я заметил, заключается в том, что я не могу заставить tlbexp.exe
экспортировать одно из свойств в интерфейсе coclass как OLE_HANDLE
, оно просто заканчиваетсябудучи длинным в TLB, сгенерированном из сборки (на этот TLB ссылается запись TypeLib в реестре).Может ли это вызвать проблемы с обработкой событий?
Есть идеи, как это отладить?