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

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

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

Обсуждение программирования на Visual Basic в конференции ru.visual.basic


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

>> Вы уж там наверху определитесь. А то я 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

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"

Hi Dmitry!

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

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


--
With best regards
Dmitry Viazowkin


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


нашел

From: "A. Skrobov"

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 (2:5020/175.2)


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

From: "A. Skrobov"

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

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

* Origin: FidoNet Online (2:5020/175.2)


Threads

From: "A. Skrobov"

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 (2:5020/175.2)


Threads

From: "A. Skrobov"

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 (2:5020/175.2)



Назад Содержание Вперед