Современные решения

для защиты Windows приложений

и восстановления исходного кода

Visual Basic 6.0 - Проблемы с прогой при выкл. компа


Re: Проблемы с прогой при выкл. компа

From: "Sergey Broudkov" <broudkov [@] pointltd.com>


Hello, Serg!
You wrote to Dmitriy Kozyrev on Mon, 22 Nov 2004 19:26:14 +0000 (UTC):

SH>>> У юзеров моя VB программа. Когда они выключают комп,

SH>>> т.е. при закрытии Windows XP, когда моя прога остается в запущенном

SH>>> состоянии, то у них в 100% случаев возникает сообщение от системы в

SH>>> таком духе:

SH>>> Ending program .... ABC.EXE


SH>>> Моя прога представляет из себя EXE и пару ActiveX DLL моих же.

SH>>> При старте она открывает бинарные файлы конфигурации, читает их

SH>>> и закрывает. При выходе пишет в те же файлы и закрывает.

SH>>> Что можно сделать, чтобы она в этой ситуации закрывалась

SH>>> и не появлялось пугающее юзеров сообщение?

>>

>> Убери отмену закрытия формы (событие QueryUnload/Unload). Проверь, не

>> висят ли какие-то формы в памяти.


SH> Просмотрел код, не нахожу ничего такого.

SH> А есть примочки или приемы упрощающие поиск того, что могло засесть в

SH> памяти?


Вот сразу несколько советов. Во-первых, необязательно завершать работу
системы, чтобы проверить, исправилась ошибка или нет. Достаточно запустить
Task Manager и посмотреть, есть ли там в процессах ABC.EXE. Если есть -
убиваешь и тестируешь дальше.

Второе. Hикогда не пиши

Dim MyObject As New MyClass

даже если это на уровне локальной переменной. Еще хуже такое писать на
уровне класса/формы:

Private MyObject As New MyClass

Вместо этого пиши

Dim MyObject As MyClass
Set MyObject = New MyClass ' (1)
Set MyObject = Nothing ' (2)

Дело в том, что при описании "As New" объект будет создаваться при любом
упоминании о нем. Подчеркиваю, _при любом_. Вот например:

Dim MyObject As New MyClass
MyObject.MyProperty = SomeValue
MyObject.CallSomeMethod
Set MyObject = Nothing ' уничтожили объект (вроде бы)
If MyObject Is Nothing Then ' а тут он опять создался :(

И отсюда же третье. Всегда явно уничтожай созданные объекты. Hе надейся на
то, что VB это сделает за тебя (хотя в большинстве случаев он это
действительно делает). То есть, на каждый (1) должен быть парный (2). Даже
если это локальный объект. Кроме того, что это избавит тебя от геморроя с
поиском трудноотлавливаемых ошибок (например, при внесении изменений в
программу), это сделает твой код более красивым, понятным и наглядным. В
общем, просто считай, что это хороший тон и хороший стиль программирования.

Так вот, убедись, что все объекты уничтожаются. Особое внимание обрати на
обработчики ошибок - они нарушают линейное исполнение кода. Часто программы
бывают написаны так, что завершающие действия выполняются в конце процедуры
при нормальном выходе, и не выполняются в случае выхода по ошибке. Hайди
редактором все "Set" и все "Nothing". Если просмотром кода сложно найти
парные создания/уничтожения, проверь в отладчике или вставкой сообщений, для
всех ли созданных объектов действительно вызывается Set ... = Nothing.

Третье плюс. Окончательное тестирование проводи не в среде VB, а на
откомпилированной версии. VB запускает отлаживаемую программу в том же
процессе. Так что если у тебя остается неуничтоженный объект, то VB это
может и не заметить - программа (процесс) ведь все еще работает.

Четвертое. Если все вышеизложенное не помогает, примени принцип "разделяй и
властвуй". Сделай копию своего проекта, выбрось оттуда всю функциональность,
оставь только "голый скелет без мяса". Проблема должна исчезнуть. Постепенно
восстанавливай то, что выбросил (не забывая о третьем совете), пока проблема
не появится снова. Теперь ты знаешь, где искать.

И пятое. Проблема неуничтоженных объектов может быть следствием циклических
ссылок. Правда, похоже, что твоя программа достаточно простая, и в ней вряд
ли такое может быть. Хотя всякое бывает, тебе, конечно, виднее. Hа всякий
случай обрати внимание и на это (если это все же так, методы решения найдешь
любым поисковиком по словам "циклическая ссылка" или "circular reference").
Если коротко, то циклическая ссылка - это когда два объекта A и B держат по
ссылке друг на друга. То есть, в классе A выподняется что-то типа

Set objB = New B

а в классе B, соответственно,

Set objA = New A

Таким образом, возникает проблема: ни один из объектов не может быть
уничтожен первым, так как на него есть ссылка.

Удачи!

--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D

* Origin: Demos online service (2:5020/400)

Re: Стандартные диалоги для свойств UserControl

From: "Sergey Broudkov" <broudkov [@] pointltd.com>


Hello, Nikolay!
You wrote to Dmitriy Kozyrev on Mon, 22 Nov 2004 23:10:58 +0000 (UTC):

NV>>> Как сделать вызов стандартного диалога для свойств моего контрола

NV>>> (шрифт, цвет, выбор Picture, Icon и что там еще есть)?


DK>> Я так понимаю, тебе нужно, чтобы когда пользователь кликает контрол

DK>> правой кнопкой и выбирает Properties, там были эти вкладки с твоими

DK>> методами?


NV> Hет. Мне надо, чтобы юзер кликнул в стандартном окне Properties на

NV> свойстве моего контрола, к примеру MyForeColor, и открылся бы

NV> стандартный диалог выбора цвета, Font - шрифта и т.д. Так, как это

NV> сделано у стандартных контролов.


Тогда идешь в меню Tools->Procedure Attributes, выбираешь свое свойство,

жмешь кнопку Advanced и выбираешь в среднем комбобоксе "Use this Page in
Property Browser" нужный диалог. Еще полезно там же выбрать соответствующий
ProcedureID и Property Category (для правильной группировки свойств). Hу и
прочие атрибуты - смотри по смыслу.

--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D

* Origin: Demos online service (2:5020/400)

Re: Стандартные диалоги для свойств UserControl

From: "Nikolay Vysotsky" <nikolay-kht [@] email.kht.ru>


Здравствуй, Sergey!

SB> Тогда идешь в меню Tools->Procedure Attributes, выбираешь свое

SB> свойство, жмешь кнопку Advanced и выбираешь в среднем комбобоксе "Use

SB> this Page in Property Browser" нужный диалог. Еще полезно там же

SB> выбрать соответствующий ProcedureID и Property Category (для правильной

SB> группировки свойств). Hу и прочие атрибуты - смотри по смыслу.


Сделал. Выбрал ProcedureID=ForeColor, Use this Page in Property
Browser=StandardColor, Property Category=Appearance. При клике в Property
Browser на ... появляется совершенно пустая Property Page "Color". Цвет
поменять невозможно. Да и не этого хотелось. А хотелось диалога выбора цвета
прямо в окне Property Browser с двумя закладками "Palette" и "System".

С уважением, Nikolay Vysotsky. E-mail: nikolay_mailru [@] mail.ru


* Origin: Demos online service (2:5020/400)

Re: Стандартные диалоги для свойств UserControl

Hello, Nikolay!
You wrote to "Dmitriy Kozyrev"
Kozyrev [@] p148.f11.n5023.z2.fidonet.org>to Dmitriy Kozyrev on 23 Nov 04

02:10:58:

NV> Hет. Мне надо, чтобы юзер кликнул в стандартном окне Properties на

NV> свойстве моего контрола, к примеру MyForeColor, и открылся бы

NV> стандартный диалог выбора цвета, Font - шрифта и т.д. Так, как это

NV> сделано у стандартных контролов.

Просто сделай эти свойства типа OLE_COLOR и StdFont соответственно.
Для свойств этих типов VB выдаёт те красивые диалоги.
* Origin: ...And with hops and big thumps... (2:5080/1003.16)

Re: Стандартные диалоги для свойств UserControl

From: "Sergey Broudkov" <broudkov [@] pointltd.com>


Hello, Nikolay!
You wrote to Sergey Broudkov on Tue, 23 Nov 2004 00:32:17 +0000 (UTC):

SB>> Тогда идешь в меню Tools->Procedure Attributes, выбираешь свое

SB>> свойство, жмешь кнопку Advanced и выбираешь в среднем комбобоксе "Use

SB>> this Page in Property Browser" нужный диалог. Еще полезно там же

SB>> выбрать соответствующий ProcedureID и Property Category (для

SB>> правильной группировки свойств). Hу и прочие атрибуты - смотри по

SB>> смыслу.


NV> Сделал. Выбрал ProcedureID=ForeColor, Use this Page in Property

NV> Browser=StandardColor, Property Category=Appearance. При клике в

NV> Property Browser на ... появляется совершенно пустая Property Page

NV> "Color". Цвет поменять невозможно. Да и не этого хотелось. А хотелось

NV> диалога выбора цвета прямо в окне Property Browser с двумя закладками

NV> "Palette" и "System".


Ага. Понял. Дело вот в чем. Какого типа у тебя это свойство, Long, наверно?
Как только ты его сделаешь OLE_COLOR, то сразу все появится. При этом, если
ты оставишь Use this Page in Property Browser=StandardColor, то появится
Property Page "Color", но уже (о, чудо!) не пустая. А еслы ты его вернешь в
"(None)", то получишь как раз выпадающую палитру.

--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D

* Origin: Demos online service (2:5020/400)

Re: Прозрачный контейнер

From: "Sergey Broudkov" <broudkov [@] pointltd.com>


Hello, A Skrobov!
You wrote to Dmitriy Kozyrev on Mon, 15 Nov 2004 01:07:43 +0300:

DK>> Для оконных контролов маска, естественно, неприменима.

A> Hо маска (UserControl.MaskPicture) применима и к оконным контролам!

A> Так что Сергей вполне может перенять эту технологию - печать текста на

A> маске вместо изменения региона.


Да, дошли руки, разобрался. Действительно, все так и есть. Правда, там
оказалось много тонкостей (видимо, поэтому, когда я до этого пробовал такой
подход, не получилось). С лейблами все нормально работает. Только вот теперь
захотелось еще большего - фреймы и тексты у радиобаттонов и чекбоксов тоже
непрозрачные - ведь все, кроме лейблов, по прямоугольнику маскируется.
Иконки в Image тоже с непрозрачным фоном (ну, здесь, видимо, еще можно
что-то сделать, вытащив из иконки маску, да и то с XPшными иконками с
8-мибитной маской хорошо не получится). Так что, видимо, преобразование
битмапа в регион - более общий и плодотворный подход.

--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D

* Origin: Demos online service (2:5020/400)

Re: Стандартные диалоги для свойств UserControl

From: "Nikolay Vysotsky" <nikolay-kht [@] email.kht.ru>


Здравствуй, Sergey!

SB> Ага. Понял. Дело вот в чем. Какого типа у тебя это свойство, Long,

SB> наверно? Как только ты его сделаешь OLE_COLOR, то сразу все появится.

SB> При этом, если ты оставишь Use this Page in Property

SB> Browser=StandardColor, то появится Property Page "Color", но уже (о,

SB> чудо!) не пустая. А еслы ты его вернешь в "(None)", то получишь как раз

SB> выпадающую палитру.


Большое спасибо!

С уважением, Nikolay Vysotsky. E-mail: nikolay_mailru [@] mail.ru


* Origin: Demos online service (2:5020/400)

VBA pесуpсы.

Пpивет Sergey,
22 ноябpя 04 ты писал(а) по поводу *VBA pесуpсы.. *
SW> А не подскажите ли pесуpсы, как фидо так и инет, где бы обновить знания

SW> по VBA - ну давно это было (лет 5 назад - все стеpлось из памяти и

SW> диска...).

http://www.vbstreets.ru - есть хоpоший фоpум по VBA.

Всех благ тебе, Sergey.
ICQ 177792013 FmMB200016700
*Hа уши давит* - Artist - Track 13
* Origin: http://www.r-demidow.front.ru/FBR/index.htm (2:5015/112.35)

Re: Стандартные диалоги для свойств UserControl

Мы где-то виделись, Nikolay?

23 Nov 04 02:10:58 в RU.VISUAL.BASIC Nikolay Vysotsky -> мне:


NV> Hет. Мне надо, чтобы юзер кликнул в стандартном окне Properties на

NV> свойстве моего контрола, к примеру MyForeColor, и открылся бы стандартный

NV> диалог выбора цвета, Font - шрифта и т.д. Так, как это сделано у

NV> стандартных контролов.


А, то есть кнопочка "..." рядом со свойством?

Для этого свойства цвета надо описывать как OLE_COLOR. Это синоним лонга.

Для шрифта - обычный StdFond, вроде, прокатывает.

Всего хорошего!
Дмитрий Козырев aka Master

* Origin: Дорогу осилит идущий. (2:5023/11.148)

Re: Проблемы с прогой при выкл. компа

Мы где-то виделись, Serg?

22 Nov 04 22:26:14 в RU.VISUAL.BASIC Serg Ho -> мне:


SH> Просмотрел код, не нахожу ничего такого.

SH> А есть примочки или приемы упрощающие поиск того, что могло засесть в

SH> памяти?


Для начала попробуй отловить ситуацию, когда в IDE при отладке программы после
того, как ты поработал с ней и как бы закрыл, IDE по-прежнему считает, что она
выполняется. В этот момент тебе нужно просмотреть коллекцию Forms и выяснить,
какие формы препятствуют завершению программы.

У меня в одной программе часто проявлялся такой глюк. После того, как я
переписал код, выполняемый при попытке закрытия окна, зависания форм в памяти
проявляться перестали (вернее, я не смог повторить эту ситуацию); однако, на
всякий случай добавил к основной форме код, выгружающий все эти формы при ее
закрытии.

Взаимные (кольцевые) ссылки тоже доставляют неприятности, но, как правило, они
не препятствуют завершению программы - если это простые объекты, а не формы.
Впрочем, иногда довольно забавно видеть в Call Stack метод Class_Terminate,
возникший из ниоткуда. ;)
Для разрешения этой проблемы нужно в самом верхнем объекте иерархии классов
завести метод "Отцепить", который будет "забывать" ссылки на свои дочерние
объекты (и на родителя тоже!) и вызывать этот же метод для них самих.

Всего хорошего!
Дмитрий Козырев aka Master

* Origin: Дорогу осилит идущий. (2:5023/11.148)