Это наиболее определенно вызвано утечками объектов VB6, которые участвуют в создании подклассов / перехвате, а не только этих.
Что мы сделали, чтобы избавиться от этих сбоев, так это были инструменты всех наших классов (включая формыпользовательские элементы управления, дизайнеры и все, что можно создать) с помощью вызовов DebugInstanceInit
и DebugInstanceTerm
в соответствующих событиях Class / Form / UserControl Initialize
и Terminate
.
Public Sub DebugInstanceInit(sModuleName As String, sDebugID As String, oObj As Object)
Public Sub DebugInstanceTerm(sModuleName As String, sDebugID As String)
Они в основном отслеживают в любое время, сколько и какие экземпляры использует приложение.Каждому экземпляру присваивается уникальный sDebugID
в DebugInstanceInit
, который используется в качестве ключа в коллекции DebugIDs
.Эта коллекция создается пустым в Sub Main
, и когда приложение заканчивается (т.е. в основной форме Form_Unload
), эта коллекция должна быть пустой или с фиксированным числом оставшихся экземпляров (например, ровно 4), в противном случае ее содержимое является видом объектовмы просачиваемся.
Что исправило сбои в среде IDE?
Обратите внимание, что экземпляр создается еще до Sub Main
, что означает, что он должен оставаться Nothing
при проектировании-время.Мы просто добавили в DebugInstanceInit
простую проверку, например,
If DebugIDs Is Nothing Then
If Left$(sModuleName, 3) <> "ctx" Then
DebugPrint "DebugInstanceInit", "mdErrorHandling", sDebugID & " " & LIB_NAME & "." & sModuleName & "." & FUNC_NAME_INITIALIZE & " (This should not happen)"
End If
Else
...
End If
В основном это предотвратило создание всего , кроме необработанных пользовательских элементов управления, помещенных в формы, во время разработки.Это включает в себя GlobalMultiUse
объекты, в том числе все, к чему UC-свойства обращаются, поскольку UC-свойства являются своего рода процедурами, к которым, безусловно, обращаются во время разработки.
Таким образом, нам пришлось сильно посыпать большую часть кода UC с помощью Ambient.UserMode
проверок, подобных этой
If Ambient.UserMode Then
Set .Picture = LoadStdPicture(ucsPicHelp)
End If
Оказалось, что наша глобальная функция LoadStdPicture
была создана, например, для некоторых cDibSections
,Приятно, что когда вы ставите точку останова на (This should not happen)
отладочный оператор печати, стек вызовов показывает вам именно свойство offenting UC-нарушителя.