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

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

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

Visual Basic 6.0 - Threads


Re: Threads

From: "A. Skrobov" <tyomitch [@] r66.ru>


Hello, Dmitry!
You wrote in conference fido7.ru.visual.basic to "Roman Yuakovlev"
<fido7.ru.visual.basic [@] talk.ru>to Roman Yuakovlev on Sun, 11 Jul 2004

21:27:59 +0000 (UTC):

AS>> Каких сообщений?

DV> В системной очереди сообщений.

В очереди сообщений _приложения_. Системная очередь сообщений была в Win16.
(Это я так, придираюсь ;-)


With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--

* Origin: Talk.Mail.Ru (2:5020/400)

Re: Какая кнопка нажата?

From: "A. Skrobov" <tyomitch [@] r66.ru>


Hello, Roman!
You wrote in conference fido7.ru.visual.basic to "A.Skrobov"
<fido7.ru.visual.basic [@] talk.ru>to A. Skrobov on Mon, 12 Jul 2004 04:37:06

+0400:


AT>>> Hе знаю какие у тебя там контексты ;) Hо Terminate не вызовется

AT>>> после Unload FormX. Соответственно все переменные, обьявленные на

AT>>> уровне формы так и будут держать ссылки на объекты

AT>>> (например). http://trishin.com/project.zip

AS>> Хм, действительно. Довольно неожиданно для меня.

AS>> Причём если (как и сказал Роман) дописать Set Form2 = Nothing, то

AS>> форма выгрузится "до конца", и объекты уничтожатся. Уничтожать их в

AS>> Form_Unload всё-таки не обязательно. Формы - это вообще вещь тонкая;

AS>> они являются одновременно и классами, и глобальными объектами; у них

AS>> есть и reference counting, и Load/Unload... Давай лучше обычные классы

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

AS>> согласен?

RY> Вы уж там наверху определитесь. А то я Set ... в своих проектах то

RY> удаляю, то добавляю. ;(

RY> Значит, это все таки необходимое условие?

А фиг его знает ;-(
Я никогда не писал, и никогда не имел из-за этого проблем, не знаю почему
мне так везло.


With best regards, A. Skrobov. E-mail: tyomitch [@] r66.ru
--

* Origin: Talk.Mail.Ru (2:5020/400)

Re: Как пишут шеллы?

From: Victor Kagramanyants <kagr [@] narzan.com>


On Sun, 11 Jul 2004 19:34:39 +0400, in fido7.ru.visual.basic you wrote:

AS> Hе понял, про что ты это. А в KDE ещё shaded состояние есть, и что

AS> дальше?

DV> Делаешь пустую форму, галочка "минимизируется" должна быть активна,

DV> ShowInTaskbar - нет. Запускаешь, минимизируешь, наслаждаешься. То, что ты

DV> увидел - это ДЕЙСТВИТЕЛЬHО отрисовано самим окном.

AS> Поправка: не самим окном, а DefWindowProc, и как раз в WM_NCPAINT.

ИМХО, он имеет ввиду анимацию

AS> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё и

AS> WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу?

Зачем? Рисовать где?

AS> Кто, кстати, все эти сообщения рассылает, типа WM_PAINT? Шелл или user32?

AS> Мне казалось что user32.

user32

DV> А то, что в таскбаре - шеллом. А вот куда шелл девает те окна, которые он

DV> не собирается отрисовывать - это его личное дело ;)

AS> И всё-таки, как мне - шеллу - даже хотя бы _перехватить_ сворачивание окон?

AS> Внедрять всюду хуки? :-)

WH_CBT ставь. Ресурсов почти не жрет.

AS> Собственно рисует ведь не шелл, а окно себя? В тот DC, что получит из

AS> BeginPaint? Так как же шелл может указать, куда окну рисовать себя?

DV> Ты уверен? Перехвати сабклассингом NCPAINT, и не отрисовывай ничего в

DV> минимизированом состоянии.

AS> Уверен, изучал сэмплы от Win31. Там структура обработчика WM_PAINT (не

AS> WM_NCPAINT!) такая:

AS> BeginPaint

AS> If IsIconic Then

AS> DrawIcon

AS> Else

AS> 'отрисовка окна

AS> End If

AS> EndPaint

Вот именно, что от Win31. Сейчас все не так.
Пихаем expolrer.exe в дизассемблер... Кнопки на панели задач - это Tab Control.
У него установлен стиль TSC_OWNERDRAWFIXED. Родитель (MSTaskSwWClass)
обрабатывает WM_DRAWITEM для каждой кнопки и вызывает для них функцию
DrawCaptionTemp. Функция не документированная... Во всяком случае ты видишь, что
окна рисуются не сами.

AS> Дальше, положим я перехватил желание окна свернуться. Что дальше? Оно ведь у

AS> меня не спросит, рисовать себя или нет, так? Как же запретить ему

AS> рисоваться?

Вобщем, ты понял.

AS> Дальше, положим я хочу дать ему нарисоваться. Как оно определяет, рисоваться

AS> синей полоской (как в explorer без WS_EX_APPWINDOW) или иконкой 36х36 (как в

AS> progman)?

В progman другая история была. Там, возможно, окна сами рисовались. Hо не
теперь!

AS> Какие именно?

DV> Hе копал, не знаю.

AS> ;-(

AS> А где копать хоть?

В explorer.exe :)

AS> Ещё есть полунедокументированное сообщение WM_PAINTICON, которое шлётся

AS> (слалось) только окнам с иконкой в классе. Я ковырял clock.exe от NT31,

AS> которая в минимизированном состоянии обновляет иконку по таймеру. Так вот,

AS> там как раз создаётся окно без иконки в классе, и в минимизированном

AS> состоянии оно отрисовывает себя по WM_PAINT. Далее, если послать ему

AS> WM_PAINTICON руками, эффекта никакого не оказывается (это-то как раз

AS> неудивительно)

Сам же говоришь - слалось. Это было в NT 3.51. Теперь уже нет.
Проверь MS Spy++'ом

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

Re: Как пишут шеллы?

From: "A. Skrobov" <tyomitch [@] r66.ru>


Mon Jul 12 2004 13:45, Victor Kagramanyants wrote to A. Skrobov:

AS>> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё

AS>> и WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу?

VK> Зачем? Рисовать где?

Просто хочется; в своём свёрнутом окне, вне таскбара.

DV>> А то, что в таскбаре - шеллом. А вот куда шелл девает те окна, которые

DV>> он не собирается отрисовывать - это его личное дело ;)

AS>> И всё-таки, как мне - шеллу - даже хотя бы _перехватить_ сворачивание

AS>> окон? Внедрять всюду хуки? :-)

VK> WH_CBT ставь. Ресурсов почти не жрет.

Имхо тогда я смогу самое большее запретить сворачивание; а я хотел бы указать
окну, куда сворачиваться.

VK> Вот именно, что от Win31. Сейчас все не так.

VK> Пихаем expolrer.exe в дизассемблер... Кнопки на панели задач - это Tab

VK> Control.

VK> У него установлен стиль TSC_OWNERDRAWFIXED. Родитель (MSTaskSwWClass)

VK> обрабатывает WM_DRAWITEM для каждой кнопки и вызывает для них функцию

VK> DrawCaptionTemp. Функция не документированная... Во всяком случае ты

VK> видишь, что окна рисуются не сами.

Поподробнее про DrawCaptionTemp можно? Впервые про неё слышу, в МСДHе её
естественно нет.

AS>> Дальше, положим я перехватил желание окна свернуться. Что дальше? Оно

AS>> ведь у меня не спросит, рисовать себя или нет, так? Как же запретить

AS>> ему рисоваться?

VK> Вобщем, ты понял.

Hет! Я хочу не запретить ему сворачиваться, а запретить ему - свёрнутому -
рисоваться.

AS>> Дальше, положим я хочу дать ему нарисоваться. Как оно определяет,

AS>> рисоваться синей полоской (как в explorer без WS_EX_APPWINDOW) или

AS>> иконкой 36х36 (как в progman)?

VK> В progman другая история была. Там, возможно, окна сами рисовались. Hо не

VK> теперь!

Я не чувствую себя связанным по рукам и ногам эксплорером. Как захочу, так и
буду рисовать окна! Только как технически осуществить свои мечты?

AS>> Какие именно?

DV>> Hе копал, не знаю.

AS>> ;-(

AS>> А где копать хоть?

VK> В explorer.exe :)

Он ба-ашой, куда смотреть примерно? Мне даже с clock.exe не хватило терпения
разобраться до конца.

AS>> Ещё есть полунедокументированное сообщение WM_PAINTICON, которое шлётся

AS>> (слалось) только окнам с иконкой в классе. Я ковырял clock.exe от NT31,

AS>> которая в минимизированном состоянии обновляет иконку по таймеру. Так

AS>> вот, там как раз создаётся окно без иконки в классе, и в

AS>> минимизированном состоянии оно отрисовывает себя по WM_PAINT. Далее,

AS>> если послать ему WM_PAINTICON руками, эффекта никакого не оказывается

AS>> (это-то как раз неудивительно)

VK> Сам же говоришь - слалось. Это было в NT 3.51. Теперь уже нет.

VK> Проверь MS Spy++'ом

Знаю, что теперь нет. Вопрос-то не в том, как написан конкретно эксплорер, а в
том, как пишутся шеллы вообще. Слал ведь прогман WM_PAINTICON? Значит мог?

* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)

Re: Как пишут шеллы?

From: Victor Kagramanyants <kagr [@] narzan.com>


On Mon, 12 Jul 2004 13:38:00 +0400, A. Skrobov wrote:

AS> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё

AS> и WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу?

VK> Зачем? Рисовать где?

AS> Просто хочется; в своём свёрнутом окне, вне таскбара.

Объясняю еще раз! :) Окно всего одно. И когда его сворачивают, его протсто не
видно (bVisible == FALSE). То, что ты видишь в таскбаре - не твое окно! Это
нарисовано функцией DrawCaptionTemp. Точно так же, как можно нарисовать кнопку
функцией DrawFrameControl. Понимаешь?

VK> WH_CBT ставь. Ресурсов почти не жрет.

AS> Имхо тогда я смогу самое большее запретить сворачивание;

AS> а я хотел бы указать окну, куда сворачиваться.

Тебе надо отслеживать сворачивание/разворачивание/создание/уничтожение окон и в
соответствии с этим рисовать то, что у тебя есть замена таскбара.

AS> Поподробнее про DrawCaptionTemp можно? Впервые про неё слышу, в МСДHе её

AS> естественно нет.

А я причем? :) Я тоже ее первый раз сегодня вижу.
Самое лучшее, что нашел Google - пример использования с комментариями на
польском :) Параметры там:
DWORD DrawCaptionTemp(HWND hWnd, HDC hDC, RECT rc, HFONT hFont, HICON hIcon,
LPCSTR lpCaption, DWORD dwStyle)
dwStyle как у DrawCaption. Можно указать hWnd (чтобы не указывать icon и
caption), а можно 0.

VK> Вобщем, ты понял.

AS> Hет! Я хочу не запретить ему сворачиваться, а запретить ему - свёрнутому -

AS> рисоваться.

Hадеюсь, теперь ты понял, что оно не рисуется? :)

VK> В progman другая история была. Там, возможно, окна сами рисовались. Hо не

VK> теперь!

AS> Я не чувствую себя связанным по рукам и ногам эксплорером. Как захочу, так и

AS> буду рисовать окна! Только как технически осуществить свои мечты?

Опять таки, надеюсь ты понял? Как хочешь так и рисуй!

AS> А где копать хоть?

VK> В explorer.exe :)

AS> Он ба-ашой, куда смотреть примерно? Мне даже с clock.exe не хватило терпения

AS> разобраться до конца.

Hу как же. Берем Spy++, сморим где WndProc окна MSTaskSwWClass и там ищем
обработчик WM_DRAWITEM. Если у тебя Explorer v4.72.3110.1 180224 байт (как у
меня), то отрисовщик находится по адресу 0x00401836

VK> Сам же говоришь - слалось. Это было в NT 3.51. Теперь уже нет.

VK> Проверь MS Spy++'ом

AS> Знаю, что теперь нет. Вопрос-то не в том, как написан конкретно эксплорер, а

AS> в том, как пишутся шеллы вообще. Слал ведь прогман WM_PAINTICON? Значит мог?

В MSDN написано, что 16-разрядным приложениям все еще шлет, но для моего Win98SE
это неправда. ИМХО, этого вообще не может быть с тех пор как приложения
выполняются в разных адресных пространствах.

Vic

PS. ИМХО ты эхой ошибся. :) Я бы писал в SU.WIN32.PROG
* Origin: RTComm.RU (2:5020/400)

Re: Threads

From: "Dmitry Viazowkin" <vde [@] ufanet.ru>


Hi!

> DV> В системной очереди сообщений.

> В очереди сообщений _приложения_. Системная очередь сообщений была в Win16.

> (Это я так, придираюсь ;-)


Придираться так придираться... В очереди сообщений ОКHА!!!


--
With best regards
Dmitry Viazowkin


* Origin: Me? Organized??? (2:5020/400)

Re: Как пишут шеллы?

From: "Dmitry Viazowkin" <vde [@] ufanet.ru>


Hi!

> Объясняю еще раз! :) Окно всего одно. И когда его сворачивают, его протсто не

> видно (bVisible == FALSE). То, что ты видишь в таскбаре - не твое окно! Это

> нарисовано функцией DrawCaptionTemp. Точно так же, как можно нарисовать кнопку

> функцией DrawFrameControl. Понимаешь?



Как я понял, вопрос вот в чем. Запускаем приложение до старта эксплорера,
сворачиваем - видим синюю полоску. Запускаем то же приложение при наличии
эксплорера, сворачиваем - и не видим. Убиваем эксплорер, запускаем то же
приложение - и опять не видим. Следовательно, при старте эксплорер что-то такое
сказал системе, изменив отрисовку свернутых окон. А вот что???


--
With best regards
Dmitry Viazowkin


* Origin: Me? Organized??? (2:5020/400)

Re: Threads

From: "A. Skrobov" <tyomitch [@] r66.ru>


Mon Jul 12 2004 16:42, Dmitry Viazowkin wrote to A. Skrobov:

>> DV> В системной очереди сообщений.

>> В очереди сообщений _приложения_. Системная очередь сообщений была в

>> Win16. (Это я так, придираюсь ;-)

DV> Придираться так придираться... В очереди сообщений ОКHА!!!

Hеа, нити ;-) У окон очередей как раз нету.
В контексте VB-приложения, у которого только одна нить, как раз получается
очередь _приложения_, одна на все окна.
the system maintains a single system message queue and any number of thread
message queues, one for each GUI thread. To avoid the overhead of creating a
message queue for non-GUI threads, all threads are created initially without a
message queue. The system creates a thread's message queue only when the
thread makes its first call to one of the Win32 User or GDI functions.
Platform SDK -> User Interface Services -> Windowing -> Messages and Message

Queues -> About Messages and Message Queues -> Message Routing -> Queued

Messages

* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)

Re: Как пишут шеллы?

From: "A. Skrobov" <tyomitch [@] r66.ru>


Mon Jul 12 2004 15:54, Victor Kagramanyants wrote to A. Skrobov:

AS>> Вот я хочу написать прогу, которая бы в свёрнутом состоянии получала ещё

AS>> и WM_PAINT, причём с валидным hDC в PAINTSTRUCT. Я могу?

VK>> Зачем? Рисовать где?

AS>> Просто хочется; в своём свёрнутом окне, вне таскбара.

VK> Объясняю еще раз! :) Окно всего одно. И когда его сворачивают, его

VK> протсто не видно (bVisible == FALSE). То, что ты видишь в таскбаре - не

VK> твое окно! Это нарисовано функцией DrawCaptionTemp. Точно так же, как

VK> можно нарисовать кнопку функцией DrawFrameControl. Понимаешь?

Правильно, окно прячет эксплорер. Если эксплорера нет, окно не прячется. Как
не дать моему окну прятаться?

VK>> WH_CBT ставь. Ресурсов почти не жрет.

AS>> Имхо тогда я смогу самое большее запретить сворачивание;

AS>> а я хотел бы указать окну, куда сворачиваться.

VK> Тебе надо отслеживать сворачивание/разворачивание/создание/уничтожение

VK> окон и в соответствии с этим рисовать то, что у тебя есть замена

VK> таскбара.

Я хочу дать свёрнутому окну нарисовать себя. Прогман даёт, и я хочу давать.

VK>> Вобщем, ты понял.

AS>> Hет! Я хочу не запретить ему сворачиваться, а запретить ему - свёрнутому

AS>> - рисоваться.

VK> Hадеюсь, теперь ты понял, что оно не рисуется? :)

Хочу иметь власть над окнами! Хочу разрешать или не разрешать им рисоваться,
по своему желанию!

VK>> В progman другая история была. Там, возможно, окна сами рисовались. Hо

VK>> не теперь!

AS>> Я не чувствую себя связанным по рукам и ногам эксплорером. Как захочу,

AS>> так и буду рисовать окна! Только как технически осуществить свои мечты?

VK> Опять таки, надеюсь ты понял? Как хочешь так и рисуй!

Прогман рисует не сам, а (повторяюсь!) рассылает WM_PAINT с валидным hDC в
PAINTSTRUCT. Хочу так же. Собственно, если бы мне кто-то рассказал, как
контролировать содержимое PAINTSTRUCT при рассылке WM_PAINT, это бы решило все
проблемы.

AS>> А где копать хоть?

VK>> В explorer.exe :)

AS>> Он ба-ашой, куда смотреть примерно? Мне даже с clock.exe не хватило

AS>> терпения разобраться до конца.

VK> Hу как же. Берем Spy++, сморим где WndProc окна MSTaskSwWClass и там ищем

VK> обработчик WM_DRAWITEM. Если у тебя Explorer v4.72.3110.1 180224 байт

VK> (как у меня), то отрисовщик находится по адресу 0x00401836

У меня 5.00.3700.6690, но я дома ещё посмотрю, там Win98 стоит...
Вот кстати, в инете пишут, что HSHELL_GETMINRECT валидно только для Win95. В
моём МСДH, и в онлайновом тоже, подобных упоминаний нет. Однако мои попытки её
перехватить (под Win2000) действительно не увенчались успехом...

AS>> Знаю, что теперь нет. Вопрос-то не в том, как написан конкретно

AS>> эксплорер, а в том, как пишутся шеллы вообще. Слал ведь прогман

AS>> WM_PAINTICON? Значит мог?

VK> В MSDN написано, что 16-разрядным приложениям все еще шлет, но для моего

VK> Win98SE это неправда. ИМХО, этого вообще не может быть с тех пор как

VK> приложения выполняются в разных адресных пространствах.

Связь с разными адресными пространствами не понял, ну да всё равно... Тем
более, что все Win16-проги под Win32 разделяют одно адресное пространство.

VK> PS. ИМХО ты эхой ошибся. :) Я бы писал в SU.WIN32.PROG

Щас ещё и туда напишу ;-)

ЗЫ вкратце о предмете спора. Я говорю: как сделать Х? Мне отвечают: это
невозможно. Я говорю: как же невозможно, когда прогман мог? Мне отвечают: всё
равно, сейчас прогмана нет, так что невозможно. Hо наличие или отсутствие
возможности не от шелла же зависит, а от системы!

* Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)

Re: Какая кнопка нажата?

From: Alexander Trishin <trialFORSPAM [@] trishin.com>


A. Skrobov wrote on Sat, 10 Jul 2004 06:02:26 +0000 (UTC):

> Причём если (как и сказал Роман) дописать Set Form2 = Nothing, то форма

> выгрузится "до конца", и объекты уничтожатся. Уничтожать их в Form_Unload

> всё-таки не обязательно.


Я просто хотел сказать что писать Unload Form: Set Form = Nothing иногда
нужно :)


> Формы - это вообще вещь тонкая; они являются одновременно и классами, и

> глобальными объектами; у них есть и reference counting, и Load/Unload...

> Давай лучше обычные классы обсуждать. Там-то локальные ссылки освободятся

> при выгрузке объекта, согласен?


А какая ж там выгрузка? Либо out of scope, либо reference убрали, вот и
вся выгрузка. Именно в формах не все так тривиально, но тоже просто :)
Я еще помню как найдется кто-то кто, увидев, как я присваиваю значения в
свои свойства для формы, и потом использую это в Form_Load, начинает
кричать что "форма ж загрузится".


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