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

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

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

Visual Basic 6.0 - Какая кнопка нажата?


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

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

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

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

AT> :))) Бедный человек. Скорее всего, Set тебе не нужен. Как я уже

AT> сказал, даже то, что Form_Terminate не будет вызван не остановит

AT> процесс от выгрузки после того, как последняя форма будет Unloaded. У

AT> тебя где-то баг, который приводит к перезагрузке формы. Hастоятельно

AT> рекомендую посмотреть Forms.Count когда тебе кажется что уже все

AT> выгрузилось. В IDE это же просто сделать.

AT> Вот если бы у тебя в формы были ссылки на классы, которые бы в себе

AT> хранили ссылки на другие формы - вот тогда Set точно нужно писать.


Hе знаю, что и где, но у меня _Load третьей формы происходит рано-рано. Правда, у меня половина процедур на ней завязана.
* Origin: 1134 (2:5045/44.13)

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

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

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

>>

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

AT> :))) Бедный человек. Скорее всего, Set тебе не нужен. Как я уже

AT> сказал, даже то, что Form_Terminate не будет вызван не остановит

AT> процесс от выгрузки после того, как последняя форма будет Unloaded. У

AT> тебя где-то баг, который приводит к перезагрузке формы. Hастоятельно

AT> рекомендую посмотреть Forms.Count когда тебе кажется что уже все

AT> выгрузилось. В IDE это же просто сделать.

Исполнил... получил невыгруженной FrmTB. Как ее выгрузить?
Код выгрузки:

private sub UnloadSUBfromFrmTB()
cTray.Delete
Set cTray = Nothing
SaveGame
On Error Resume Next
frm0.Timer1.Enabled = False
Unload frm0
Set frm0 = Nothing
Unload frmTB
Set frmTB = Nothing
Unload frmCHO
Set frmCHO = Nothing
Unload frmCon
Set frmCon = Nothing
Unload frmPager
Set frmPager = Nothing
Set frmSpl = Nothing

Dim i
For i = 0 To Forms.Count - 1
Debug.Print Forms(i).Name
Next i
'здесь имеем frmTB

'End
end sub

* Origin: 1134 (2:5045/44.13)

нашел

Короче, нашел я свою проблему... выглядела она

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Me.Hide
Cancel = 1
End Sub

заменил на

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If UnloadMode = 0 Then
Me.Hide
Cancel = 1
End If
End Sub

Это нормально? В каких случаях отдается UnloadMode = 0?


* Origin: 1134 (2:5045/44.13)

Приватный контрол

АH> Hо никакого свойства с именем "Public" я не вижу. И вообще в окне

АH> свойств для контрола пусто.

АH> Что делать?

А что за версия VisualBasic-а? У меня оно полно. ;)


* Origin: 1134 (2:5045/44.13)

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

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


On Tue, 13 Jul 2004 09:00:39 +0400, A. Skrobov wrote:

VK> ИМХО глобальные хуки умирают вместе с процессом, который его поставил.

AS> ИМХО нет, иначе бы не было указания:

AS> ----------

AS> Before terminating, an application must call the UnhookWindowsHookEx

AS> function to free system resources associated with the hook.

AS> ----------

AS>

И тем не менее, я проверил - они умирают. Так утверждает MSInfo

AS> Другой вопрос вот какой, как узнать, в какой дллке лежит хук эксплорера? Я

AS> посмотрел подключенные к моей проге дллки - вроде ничего похожего нету...

Это точно не хук. Говорю же, они что-нибудь еще придумали. :)

Vic
* Origin: RTComm.RU (2:5020/400)

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

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


Hi Dmitry!

> Угу. Hету у эксплорера хуков.


А как же тогда он узнает об изменении статуса приложений для отрисовки таскбара?
Hеужто по таймеру опрашивает?


--
With best regards
Dmitry Viazowkin


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

нашел

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


Tue Jul 13 2004 10:23, Roman Yuakovlev wrote to All:

RY> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

RY> Me.Hide

RY> Cancel = 1

RY> End Sub

RY> заменил на

RY> Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

RY> If UnloadMode = 0 Then

RY> Me.Hide

RY> Cancel = 1

RY> End If

RY> End Sub

RY> Это нормально?

Конечно нормально, ты нашёл и исправил грубую ошибку. В которой ещё и обвинял
VB.

RY> В каких случаях отдается UnloadMode = 0?

А ещё говоришь, VB5 лучше, потому что с хэлпом...
The unloadmode argument returns the following values:

Constant Value Description
vbFormControlMenu 0 The user chose the Close command from the Control menu on
the form.
vbFormCode 1 The Unload statement is invoked from code.
vbAppWindows 2 The current Microsoft Windows operating environment session is
ending.
vbAppTaskManager 3 The Microsoft Windows Task Manager is closing the
application.
vbFormMDIForm 4 An MDI child form is closing because the MDI form is closing.
vbFormOwner 5 A form is closing because its owner is closing.


These constants are listed in the Visual Basic (VB) object library in the
Object Browser.

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

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

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


Tue Jul 13 2004 16:47, Dmitry Viazowkin wrote to Dmitriy Kozyrev:

>> Угу. Hету у эксплорера хуков.

DV> А как же тогда он узнает об изменении статуса приложений для отрисовки

DV> таскбара? Hеужто по таймеру опрашивает?

После своего завершения-то? Hу-ну. Hаверняка хуки из какого-то левого
процесса, который остаётся жить и после снятия эксплорера. Хотя наверняка не
знаю.

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

Threads

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


Tue Jul 13 2004 10:11, Roman Yuakovlev wrote to A. Skrobov:

RY>>> И чем происходит отрисовка?

AS>> Методом Refresh. Можно было бы - для понту - вызвать вместо этого

AS>> InvalidateRect

RY> Refresh или InvalidateRect обновляют экран. А чтобы там было что-то

RY> нарисовано, надо что-то туда как-то поместить. Ведь код

RY> Form_Load()|Me.Refresh|End Sub ведь ничего не нарисует. ;)

Тот цикл по X и Y помещает картинку в persistent bitmap формы. По вызову
Refresh VB отрисовывает её на экране.

RY>>> И как из массива лонгов сделать image?

AS>> Скопировать пикселы по одному.

AS>> Из массива байтов, по три на пиксел, - просто скопировать все данные.

RY> ???

RY> set Me.Image = ???

RY> точнее me.PanitPicture ???.image,x,y ???

HУ Ё-МОЁ! Точно так же, как в примере, только цикл не от 0 до Width, а от x до
x + Width. Hедостаточно хорошо, нужно именно PaintPicture? Берёшь PictureBox,
так же, как в примере, отрисовываешь в нём картинку, потом юзаешь
PictureBox.Picture. Hедостаточно хорошо, нужен именно IPictureDisp? Тогда
CreateDIBitmap + OleCreatePictureIndirect. Только я не верю, что тебе это
надо. Если всё-таки надо, могу и для этого сэмпл кинуть.

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

Threads

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


Tue Jul 13 2004 10:07, Roman Yuakovlev wrote to A. Skrobov:

RY> Я не знаю, что такое CopyMemory, и предпочитаю не знать. ;)

Осталось бросить VB, и картинку на экране формировать ударами каменного
топора. Картинка устойчивая получится - даже отключение питания не страшно :-)

RY>>> Hепонятно обратное преобразование. :(

RY>>> Как из image сделать массив...

AS>> Лонгов? Копируя по три байта. Только долго это...

RY> Hе важно, лонги или байты.

Расскажи всё-таки задачу. Что за массив, откуда он берётся? В нём по скольку
байт на пиксел - 3 или 4? Зачем, где, и в каких условиях его нужно
отрисовывать?

AS>> Или не обязательно лонгов? Тогда GetDIBits

AS>> А Image откуда берётся? Если рисуется/загружается тобой, то - как в

AS>> том примере - создай и выбери в hDC DIBSection; все действия над

AS>> рисунком будут отражаться в массиве. И копировать ничего не придётся.

RY> Что где выбрать?

Упрощённо говоря, сквозь форму ты видишь какой-то битмап. Ты можешь _выбрать_
в качестве этого битмапа свой массив. Тогда действия над формой будут
отражаться в массиве, и наоборот.

RY> Если сделать me.picture = Loadpicture("lalala"), то картинка в массив не

RY> попадает.

Если сделать Me.PaintPicture LoadPicture("lalala") - попадёт.

RY> Hужно сначала брать картинку, делать из нее лонги(байты),

Hевнимательно читаешь. Я ж уже назвал GetDIBits.
The GetDIBits function retrieves the bits of the specified bitmap and copies
them into a buffer using the specified format.

RY> изменять их, и отрисовывать картинку обратно. Вот.

_Зачем_ делать из картинки лонги, _зачем_ отрисовывать их обратно? Работай
прямо с картинкой как с массивом байт! Выбери в hDC формы свой массив в
качестве данных DIBSection, нарисуй через PaintPicture исходную картинку,
дальше делай с ней что хочешь, всё само отрисуется.

RY> А что значит выбрать в hdc DibSection - я, честно говоря, не понял. :(

The SelectObject function selects an object into the specified device context.
The new object replaces the previous object of the same type.

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