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

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

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

Visual Basic 6.0 - Как пишут шеллы?


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

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


Hi All,

Я имею в виду, вот в explorer минимизированные приложения отображаются
кнопками на таскбаре, а в progman - иконками на рабочем столе. Как это
реализовано? Шелл _сам_ опрашивает все запущенные приложения, и рисует их, как
может? Или всё-таки есть что-то стандартное, типа "зарегистрировать рисовалку
минимизированных окон"? Ведь саму команду минимизации не шелл обрабатывает, а
user32?

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

Re: Threads

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


Sat Jul 10 2004 16:27, Dmitry Viazowkin wrote to A. Skrobov:

AS>> А зачем GetMessage, просто DoEvents нельзя? Он внутри себя сам всё

AS>> проверяет.

DV> Для скорости. DoEvents уж слишком тормозная, даже если и ничего нет в

DV> очереди, поэтому разница ОЧЕHЬ значительная, больше чем на порядок.

А почему бы тогда и собственный Message Pump не написать, вместо DoEvents? ;-)

DV> Убедил?

Весьма любопытно, приму к сведению :-)

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

Threads

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


Sun Jul 11 2004 11:26, A. Skrobov wrote to Roman Yuakovlev:

RY>> ps. А все почему - потому что полтора года мне никто не хочет говорить,

RY>> как сделать iPictureDisp <> MyLongValues(X,Y) ;)

AS> Я скажу :-)

AS> Это так, схематично ;-) В понедельник выложу куда-нибудь сэмпл.

Понедельник начинается в воскресенье ;-)

VERSION 5.00
Begin VB.Form Form1
AutoRedraw = -1 'True
Caption = "Form1"
ClientHeight = 4320
ClientLeft = 60
ClientTop = 345
ClientWidth = 5400
LinkTopic = "Form1"
ScaleHeight = 4320
ScaleWidth = 5400
StartUpPosition = 3 'Windows Default
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Type BITMAPINFOHEADER
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
Private Type SAFEARRAY2D
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
cElements0 As Long
lLbound0 As Long
cElements1 As Long
lLbound1 As Long
End Type
Private Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" (Ptr()
As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest
As Any, lpvSource As Any, ByVal cbCopy As Long)
Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal
hObject As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As
Long
Private Declare Function CreateDIBSection Lib "gdi32" (ByVal hDC As Long,
pBitmapInfo As BITMAPINFOHEADER, ByVal un As Long, lplpVoid As Long, ByVal
handle As Long, ByVal dw As Long) As Long

Private Sub Form_DblClick()
Dim m_hDib As Long, m_hBmpOld As Long
Dim m_tBI As BITMAPINFOHEADER, m_lPtr As Long
With m_tBI
.biSize = Len(m_tBI)
.biWidth = 256
.biHeight = 256
.biPlanes = 1
.biBitCount = 24
.biSizeImage = .biWidth * (m_tBI.biWidth * 3 + m_tBI.biWidth Mod 4)
End With
m_hDib = CreateDIBSection(hDC, m_tBI, 0, m_lPtr, 0, 0)
m_hBmpOld = SelectObject(hDC, m_hDib)

Dim tSA As SAFEARRAY2D
Dim bDib() As Byte
With tSA
.cbElements = 1
.cDims = 2
.lLbound0 = 0
.cElements0 = m_tBI.biHeight
.lLbound1 = 0
.cElements1 = m_tBI.biWidth * 3 + m_tBI.biWidth Mod 4
.pvData = m_lPtr
End With
CopyMemory ByVal VarPtrArray(bDib()), VarPtr(tSA), 4

Dim X As Integer, Y As Integer
For Y = 0 To m_tBI.biHeight - 1
For X = 0 To m_tBI.biWidth - 1
CopyMemory bDib(X * 3, Y), RGB(X, Y, 128), 3
Next
Next

CopyMemory ByVal VarPtrArray(bDib()), 0&, 4
Refresh

Call SelectObject(hDC, m_hBmpOld)
DeleteObject m_hDib
End Sub

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

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

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


Hi!

> Я имею в виду, вот в explorer минимизированные приложения отображаются

> кнопками на таскбаре, а в progman - иконками на рабочем столе. Как это


А ты сними галочку "ShowInTaskbar" и минимизируй ;)

> реализовано? Шелл _сам_ опрашивает все запущенные приложения, и рисует их, как

> может? Или всё-таки есть что-то стандартное, типа "зарегистрировать рисовалку

> минимизированных окон"? Ведь саму команду минимизации не шелл обрабатывает, а


Обрабатывает некоторые системные сообщения. А по получению таки да, EnumWindows,
и рисует.


--
With best regards
Dmitry Viazowkin


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

Re: Threads

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


Hi!

> А почему бы тогда и собственный Message Pump не написать, вместо DoEvents? ;-)


Потому что DoEvents - это не только оно, но и еще куча работы рантайма по эээ..
housekeeping. Hа возвращаемое значение погляди ;)

--
With best regards
Dmitry Viazowkin


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

Threads

>> Цель такая - например, по пикселю отрисовать 999999 пикселей.


>> Допустим, это займет 2-8 секунд. В это время программа должна

>> работать, как ни в чем не бывало, отрисовка идет на невидимом

>> фрейме. Через 10 секунд идет отрисовка результата.

DV> Отрисовывай, но каждые N итераций проверяй наличие новых соообщений

DV> (GetMessage), и при наличии - DoEvents. Прекрасно раотает без всяких

DV> потоков.

Каких сообщений? Как их куда передавать, как ловить?


* Origin: 1134 (2:5045/44.13)

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

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> согласен?

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

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

* Origin: 1134 (2:5045/44.13)

Threads

RY>>> ps. А все почему - потому что полтора года мне никто не хочет

RY>>> говорить, как сделать iPictureDisp <> MyLongValues(X,Y) ;)

AS>> Я скажу :-)

AS>> Это так, схематично ;-) В понедельник выложу куда-нибудь сэмпл.

AS> Понедельник начинается в воскресенье ;-)

О, спасибо!

Только ничего не понятно. Где идет какое преобразование, кому скармливать картинку, кому скармливать массив?


AS> Private Sub Form_DblClick()

AS> Dim m_hDib As Long, m_hBmpOld As Long

AS> Dim m_tBI As BITMAPINFOHEADER, m_lPtr As Long

AS> With m_tBI

AS> .biSize = Len(m_tBI)

AS> .biWidth = 256

AS> .biHeight = 256

AS> .biPlanes = 1

AS> .biBitCount = 24

AS> .biSizeImage = .biWidth * (m_tBI.biWidth * 3 + m_tBI.biWidth

AS> Mod 4)

AS> End With

AS> m_hDib = CreateDIBSection(hDC, m_tBI, 0, m_lPtr, 0, 0)

AS> m_hBmpOld = SelectObject(hDC, m_hDib)


Это описательная структура картинки. Хедер то есть.


AS> Dim tSA As SAFEARRAY2D

AS> Dim bDib() As Byte

AS> With tSA

AS> .cbElements = 1

AS> .cDims = 2

AS> .lLbound0 = 0

AS> .cElements0 = m_tBI.biHeight

AS> .lLbound1 = 0

AS> .cElements1 = m_tBI.biWidth * 3 + m_tBI.biWidth Mod 4

AS> .pvData = m_lPtr

AS> End With


Это тайны агентов моссада, слово ptr указывает на указатель.


AS> CopyMemory ByVal VarPtrArray(bDib()), VarPtr(tSA), 4


Угу.


AS> Dim X As Integer, Y As Integer

AS> For Y = 0 To m_tBI.biHeight - 1

AS> For X = 0 To m_tBI.biWidth - 1

AS> CopyMemory bDib(X * 3, Y), RGB(X, Y, 128), 3

AS> Next

AS> Next


Вот. Вот это, как я понял, ключевой момент сей оперы? Т.е. что-то копируется в массив?


AS> CopyMemory ByVal VarPtrArray(bDib()), 0&, 4

AS> Refresh

AS> Call SelectObject(hDC, m_hBmpOld)

AS> DeleteObject m_hDib


А это что такое? Что копируется сверху? И почему завершаетсЯ SelectObject'ом? Это что-то дает. И чем происходит отрисовка?

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


* Origin: 1134 (2:5045/44.13)

Threads

RY> Вот. Вот это, как я понял, ключевой момент сей оперы? Т.е. что-то

RY> копируется в массив?

вот это я заменил на

bDib(X * 3, Y) = X
bDib(X * 3 + 1, Y) = Y
bDib(X * 3 + 2, Y) = 128

стало совсем понятно.

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

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


* Origin: 1134 (2:5045/44.13)

Re: Threads

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


Hi!

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


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


>Как их куда передавать,


Винды их туда передают


>как ловить?


Я пример кидал. В твоем случае - для выхода из цикла при наличии сообщений:

If PeekMessage(pmsg, 0, 0, 0, PM_NOYIELD Or PM_NOREMOVE) <> 0 Then

exit do


--
With best regards
Dmitry Viazowkin


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