Procmon не помог. Microsoft взяла глубокий образ системы в момент возникновения проблемы.
Они нашли неверный код ошибки HRESULT. Что-то глубоко во время выполнения VB6 пыталось получить доступ к объекту с поздней привязкой, но не объявленному через интерфейс IDispatch. Они быстро запланировали звонок со мной. Я спросил, какой объект вызывается через IDispatch; в частях VB6 моего проекта нет вызовов с поздним связыванием. («явная опция»)
Во время разговора они сказали, чтобы я уходил. Они отказались помочь определить дальнейшие основные причины, потому что был задействован код VB6, а отделу поддержки запрещено устранять проблемы с VB6. Я возразил, что это явно проблема в поддерживаемой среде выполнения, но безрезультатно.
Вместо этого я прочитал 20-минутную лекцию об экономике поддержки чего-либо, когда не было денег, чтобы заработать. Я ответил военной историей о трижды виртуализированном приложении, которое все еще работает после 35 лет в телефонной компании.
Они были хорошими парнями; они хотели помочь мне решить проблему, но их политика запретила это. Я не ближе к коренной причине сегодня, чем был, когда отправил вопрос.
Однако, если вы вызываете MsgBox из среды выполнения VB6, он отправляет WM_USER
сообщения другим формам VB6 в проекте. Что, в свою очередь, в моем случае вызвало MDIForm_Activate
, в котором был этот код:
Me.TreeView1.SetFocus
И это, несмотря на то, что TreeView1 по определению был объявлен явно, было тем, что они объявили как причину неудачного вызова IDispatch с поздним связыванием, в то же время отказываясь объяснять, как это могло быть. Парень по телефону даже зашёл так далеко, что сказал, что абсолютно может это выяснить, но политика Microsoft запретила это, потому что это VB6.
Удаление вызова SetFocus
устранило обстоятельство, вызвавшее ошибку.