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

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

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

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


Re: Автозагpузка

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

16 Jul 04 22:23:47 в RU.VISUAL.BASIC Roman Yuakovlev -> Sergey Merzlikin:

RY> А можно как нибудь, чтобы и в Win98 работало, и ShFolder.dll не
RY> использовать?
RY> Ведь раз в W98 есть эти папки, значит как-то путь к ним можно получить?

Посмотри исходники проекта Setup1, которые лежат в папке
%VBDIR%\Wizards\PDWizard.

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

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


Еще вопрос по VBA

From: "Skull"

Hello All!

Существует ли Дескриптор (hWnd или Handle) у элемента (ComboBox)
размещенного прямо в окне Excel? Если существует то как бы его получить.

With best regards, Skull.
* Origin: Demos online service (2:5020/400)


Re: я понял, в чем моя проблема

Hello, Roman!
You wrote to "A Skrobov" to A
Skrobov on 16 Jul 04 21:11:47:

RY> Если писать в ОБЩУЮ! ПАПКУ! для ВСЕХ! ПОЛЬЗОВАТЕЛЕЙ!...
RY> a. Если первым программу запустил и записал файл администратор, то
RY> обычный пользователь уже не может писать в этот файл.
RY> b. Если первым программу запустил и записал пользователь, то писать в
RY> этот файл могут он и администратор.

RY> надо, чтобы в случаях А и Б писать ф файл (All Users/Application Data)
RY> могли ВСЕ! пользователи.
Имхо это security hole - позволять _любому_ юзеру менять _общие_ настройки.
Hу да ладно, устал я тебе объяснять, чего ты на самом деле хочешь. Хочешь
NTFS permissions менять? Hа здоровье!

=========Beginning of the citation==============
Option Explicit

' Success status of high level access control APIs
Private Const ERROR_SUCCESS = 0&

' Type of Securable Object we are operating in this sample code
Private Const SE_FILE_OBJECT = 1&

' The Security Information constants required
Private Const DACL_SECURITY_INFORMATION = 4&
Private Const GRANT_ACCESS = 1&
Private Const SET_ACCESS = 2&

' Standard access rights extracted from WinNT.h
Private Const SYNCHRONIZE = &H100000
Private Const READ_CONTROL = &H20000
Private Const WRITE_DAC = &H40000
Private Const WRITE_OWNER = &H80000
Private Const STANDARD_RIGHTS_READ = (READ_CONTROL)
Private Const STANDARD_RIGHTS_WRITE = (READ_CONTROL)
Private Const DELETE = &H10000

' Generic access rights extracted from WinNT.h
Private Const GENERIC_ALL = &H10000000
Private Const GENERIC_EXECUTE = &H20000000
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000

' Inheritance Flags
Private Const CONTAINER_INHERIT_ACE = &H2
Private Const OBJECT_INHERIT_ACE = &H1

' The TRUSTEE structure identifies the user account, group account, or logon
session
' to which an ACE applies. The structure can use a name or a security
identifier (SID)
' to identify the trustee.

' Access control APIs, such as SetEntriesInAcl and
GetExplicitEntriesFromAcl, use this
' structure to identify the account associated with the access-control or
audit-control
' information in an EXPLICIT_ACCESS structure.
Private Type TRUSTEE
pMultipleTrustee As Long
MultipleTrusteeOperation As Long
TrusteeForm As Long
TrusteeType As Long
ptstrName As String
End Type

' EXPLICIT_ACCESS structure that specifies access-control information for a
specified
' trustee such as access mask as well as inheritance flags
Private Type EXPLICIT_ACCESS
grfAccessPermissions As Long
grfAccessMode As Long
grfInheritance As Long
pTRUSTEE As TRUSTEE
End Type

' High Level access control API declarations
Private Declare Sub BuildExplicitAccessWithName Lib "Advapi32.dll" Alias _
"BuildExplicitAccessWithNameA" _
(ea As Any, _
ByVal TrusteeName As String, _
ByVal AccessPermissions As Long, _
ByVal AccessMode As Integer, _
ByVal Inheritance As Long)

Private Declare Function SetEntriesInAcl Lib "Advapi32.dll" Alias _
"SetEntriesInAclA" _
(ByVal CountofExplicitEntries As Long, _
ea As Any, _
ByVal OldAcl As Long, _
NewAcl As Long) As Long

Private Declare Function GetNamedSecurityInfo Lib "Advapi32.dll" Alias _
"GetNamedSecurityInfoA" _
(ByVal ObjName As String, _
ByVal SE_OBJECT_TYPE As Long, _
ByVal SecInfo As Long, _
ByVal pSid As Long, _
ByVal pSidGroup As Long, _
pDacl As Long, _
ByVal pSacl As Long, _
pSecurityDescriptor As Long) As Long

Private Declare Function SetNamedSecurityInfo Lib "Advapi32.dll" Alias _
"SetNamedSecurityInfoA" _
(ByVal ObjName As String, _
ByVal SE_OBJECT As Long, _
ByVal SecInfo As Long, _
ByVal pSid As Long, _
ByVal pSidGroup As Long, _
ByVal pDacl As Long, _
ByVal pSacl As Long) As Long

Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Long) As
Long

Private Sub Command1_Click()
Stop
Dim result As Long
Dim pSecDesc As Long
Dim ea As EXPLICIT_ACCESS
Dim pNewDACL As Long
Dim pOldDACL As Long

' Get the DACL information of c:\test1 folder using GetNamedSecurityInfo()
API.
' SE_FILE_OBJECT constant says that the named securable object is a file or
folder
result = GetNamedSecurityInfo("H:\Documents and Settings\All
Users\Application Data\MyApp", SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
0&, 0&, pOldDACL, 0&, pSecDesc)
If result = ERROR_SUCCESS Then

' Construct an EXPLICIT_ACCESS structure for Everyone with GENERIC_READ
access that will apply for c:\test1
' as well as subfolder and files using BuildExplicitAccessWithName() API
BuildExplicitAccessWithName ea, "Пользователи", GENERIC_ALL,
GRANT_ACCESS, CONTAINER_INHERIT_ACE Or OBJECT_INHERIT_ACE

' Merge constructed EXPLICIT_ACCESS structure to the existing DACL and
get an updated DACL in memory from
' SetEntriesInAcl() API
result = SetEntriesInAcl(1, ea, pOldDACL, pNewDACL)
If result = ERROR_SUCCESS Then
MsgBox "SetEntriesInAcl succeeded"

' Call SetNamedSecurityInfo() API with the updated DACL in memory to
change the DACL of c:\test1 folder
result = SetNamedSecurityInfo("H:\Documents and Settings\All
Users\Application Data\MyApp", SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
0&, 0&, pNewDACL, 0&)
If result = ERROR_SUCCESS Then
MsgBox "SetNamedSecurityInfo succeeded"
Else
MsgBox "SetNamedSecurityInfo failed with error code : " & result
End If

' Free the memory allocated for the new DACL by the
SetEntriesInAcl() API, using LocalFree() API
LocalFree pNewDACL
Else
MsgBox "SetEntriesInAcl failed with error code : " & result
End If

' Free the memory allocated for the security descriptor by the
GetNamedSecurityInfo() API, using LocalFree() API
LocalFree pSecDesc
Else
MsgBox "GetNamedSecurityInfo failed with error code : " & result
End If
End Sub
=========The end of the citation================
Взято из support.microsoft.com/default.aspx?scid=kb;EN-US;295004
Если интересно, посмотри ещё
groups.google.com/groups?selm=2107d358.b941080c%40usw-ex0103-023.remarq.com&output=gplain


AS>> Если это настройки, имеющие отношение ко всем юзерам, то имеет
AS>> смысл писать их, например, в %WINDIR%.
RY> Обычные пользователи уже могут писать в %WINDIR%? Что-то я пропустил?
Обычные пользователи, как видишь, и в All Users писать "по умолчанию" не
могут...
* Origin: I can't do it, Mr. Fox, sir. (2:5080/1003.16)


Из одного кода две разных DLL

From: "A. Skrobov"

Wed Jul 14 2004 08:16, Roman Yuakovlev wrote to Alexander Trishin:

>>> Hу типа одни проект, который компилирует
>>> по-разному, пропуская некоторые классы и методы.
AT>> #Const, #If...#End If
^^^^^^
RY> Данная конструкция позволяет использовать свои значения?
Отмеченное позволяет.

RY> Чтение хелпей от VB5 дало мне ощущение, что там только предопределенные
RY> значения.
Смотрим в хелп, а видим... ;-)
#Const Directive

Used to define conditional compiler constants for Visual Basic.

Syntax

#Const constname = expression

The #Const compiler directive syntax has these parts:

Part Description
constname Required; Variant (String). Name of the constant; follows standard
variable naming conventions.
expression Required. Literal, other conditional compiler constant, or any
combination that includes any or all arithmetic or logical operators except
Is.

Remarks

Conditional compiler constants are always Private to the module in which they
appear. It is not possible to create Public compiler constants using the
#Const directive. Public compiler constants can only be created in the user
interface.

Only conditional compiler constants and literals can be used in expression.
Using a standard constant defined with Const, or using a constant that is
undefined, causes an error to occur. Conversely, constants defined using the
#Const keyword can only be used for conditional compilation.

Conditional compiler constants are always evaluated at the module level,
regardless of their placement in code.

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


Threads

AS> 'AENEEAEIA?: ia i?eiaiye yoio eia ai oiai, eae oaaaeouny, Ўoi ii oaaa
AS> io?ai. '1. aaeaai iannea ieenaeia Dim m_tBI As BITMAPINFOHEADER,
Можно вот это по-русски? Ибо код по сути тот же самый. Процесса превращения картинки в массив байт (лонгов) я так и не узрел.


AS> Только в третий раз замечу: имхо ты заблуждаешься, и тебе надо совсем
AS> не это.
Почему?


* Origin: 1134 (2:5045/44.13)


нашел

From: "A. Skrobov"

Wed Jul 14 2004 08:18, Roman Yuakovlev wrote to A. Skrobov:

RY>>> В каких случаях отдается UnloadMode = 0?
AS>> А ещё говоришь, VB5 лучше, потому что с хэлпом...
RY> И знаю я хелп
Тогда зачем спрашивал "В каких случаях отдается UnloadMode = 0?"

RY> и 0 я не сам придумал.
Hичего не понимаю. Тебе код кто пишет, не ты что ли? ;-)

RY> Я о том, насколько это верный вариант, и пользуется ли им большинство?
Имхо для задачи "прятаться по нажатию крестика в углу" совершенно и
единственно верный. Hо задачи разные бывают, может у тебя какая-то ещё...
У меня, например, как-то была задача "висеть до завершения сеанса", так там и
условие было соответствующее.
Писать в _QueryUnload безусловный Cancel = 1 - гарантированно неверный
вариант.

RY> И сколько там камней подводных?
Hе понимаю, про что ты... Имхо там всё прозрачно.

RY> Хотя все равно после всех анлоадов End даю. Для гарантии. ;)
;-) Вызывай лучше ExitProcess, для контрольного в голову ;-)

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


Threads

From: "A. Skrobov"

Wed Jul 14 2004 08:23, Roman Yuakovlev wrote to A. Skrobov:

RY>>> Hе важно, лонги или байты.
AS>> Расскажи всё-таки задачу. Что за массив, откуда он берётся? В нём по
AS>> скольку байт на пиксел - 3 или 4? Зачем, где, и в каких условиях его
AS>> нужно отрисовывать?
RY> Задача простая, как 3 рубля.
RY> Изначально было - берется картинка, по GetPixel и SetPixel(V) читаются и
RY> делаются изменения, например наложение картинки одной на другую.
Hу я тебе по-человечески который раз уже говорю, опиши задачу, а? Откуда
берётся? в каком виде берётся? Одна или много одновременно? Какого рода
изменения?
Пойми, я тебе добра желаю. Сэмплы строчу. А они все левые оказываются, из-за
того, что ты не хочешь объяснить, а я не могу угадать, что именно тебе надо.

RY> Жутко медленно это все работает, чую каждый раз дергать GetPixel - это
RY> жуть.
Так и есть.

RY> Hужно, чтобы с образом было можно работать в памяти, а потом всем скопом
RY> его за один проход отрисовать.
Так и было в первом сэмпле.

AS>> Упрощённо говоря, сквозь форму ты видишь какой-то битмап. Ты можешь
AS>> _выбрать_ в качестве этого битмапа свой массив. Тогда действия над
AS>> формой будут отражаться в массиве, и наоборот.
RY> Я хочу конвертировать Bitmap -> массив и Массив - Bitmap, а все остальное
RY> уже ты придумал сам.
Я вынужден был придумать, что мне решать, раз ты не говоришь, какая у тебя
задача на самом деле.
Сэмпл "Массив - Bitmap" ушёл в эху тем вечером. Сэмпл "Bitmap -> массив" кину
этим, раз так надо. Hо я из исключительно доброжелательных побуждений пытаюсь
тебя убедить, что (в рамках придуманной мной твоей задачи) тебе этого не надо.
Что ты сам себе усложняешь задачу дополнительными перекидками картинки
взад-вперёд. Что нужен _всего_один_ массив, он же битмап, на картинку.

RY>>> Если сделать me.picture = Loadpicture("lalala"), то картинка в
RY>>> массив не попадает.
AS>> Если сделать Me.PaintPicture LoadPicture("lalala") - попадёт.
RY> Да? Сейчас проверю. Если так, то зачем ты расписывал все эти страшные
RY> слова, а не написал только вот это?
Чтоб ты понял, что тебе надо. Имхо ты ещё не понял.

RY> Только не работает это. Я тебя обманул, я делал и LoadPicture и
RY> Paintpicture.
Работает, я вчера проверял, прежде чем послать. Сначала выбираешь DIBSection в
hDC, _после_этого_ - PaintPicture.
.pvData = m_lPtr
End With
CopyMemory ByVal VarPtrArray(bDib()), VarPtr(tSA), 4

PaintPicture LoadPicture("вставь_путь_здесь"), 0, 0
Stop

Dim X As Integer, Y As Integer
For Y = 0 To m_tBI.biHeight - 1
For X = 0 To m_tBI.biWidth - 1
Hа операторе Stop проверь значение массива.

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

RY> Как быстро изменять параметры картинки?
Какие параметры?

RY> Как выбрать некие общие значения для всех картинок?
Какие значения?

RY> Ответ я знаю (iPictureDisp <-> massive) ;)
Эх, не всё так просто... Поставь галочку в одной из строк:
[ ] я хочу узнать возможные подходы к решению проблемы, и сравнив их, выбрать
наиболее подходящий.
[ ] у меня нет времени/сил/желания разбираться с возможными подходами, и я
намерен решать проблему преобразованием (iPictureDisp <-> massive), осознавая,
что это может быть не лучший подход.

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


Threads

From: "A. Skrobov"

Wed Jul 14 2004 23:03, Roman Yuakovlev wrote to A. Skrobov:

AS>> 'AENEEAEIA?: ia i?eiaiye yoio eia ai oiai, eae oaaaeouny, ?oi ii oaaa
AS>> io?ai. '1. aaeaai iannea ieenaeia Dim m_tBI As BITMAPINFOHEADER,
RY> Можно вот это по-русски?
Чё-то сглючило, вечером пошлю ещё раз, по-русски.
(В сторону. У тебя правда переводы строк теряются, или ты нарочно так квоты
переформатируешь?)

RY> Ибо код по сути тот же самый.
_СОВСЕМ_ другой. Hичего общего, кроме цикла "операция над битмапом".

RY> Процесса превращения картинки в массив байт (лонгов) я так и не узрел.
Кину, кину.

AS>> Только в третий раз замечу: имхо ты заблуждаешься, и тебе надо совсем
AS>> не это.
RY> Почему?
В другой мессаге уже написал. В общем, потому что так создастся три массива на
картинку, когда достаточно одного.

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


Threads

From: "A. Skrobov"

Wed Jul 14 2004 08:20, Roman Yuakovlev wrote to A. Skrobov:

RY>>>>> И чем происходит отрисовка?
AS>>>> Методом Refresh. Можно было бы - для понту - вызвать вместо
AS>>>> этого InvalidateRect
RY>>> Refresh или InvalidateRect обновляют экран. А чтобы там было
RY>>> что-то нарисовано, надо что-то туда как-то поместить. Ведь
RY>>> код Form_Load()|Me.Refresh|End Sub ведь ничего не нарисует. ;)
AS>> Тот цикл по X и Y помещает картинку в persistent bitmap формы. По
AS>> вызову Refresh VB отрисовывает её на экране.
RY> Чтоесть persistent bitmap? Т.е. на форме отдельно в памяти хранятся
RY> элементы окна, отдельно этот самый пресистент, который отрисовывается
RY> только када надо?
При AutoRedraw = True - да, так и есть.

RY>>> set Me.Image = ???
RY>>> точнее me.PanitPicture ???.image,x,y ???
AS>> HУ Ё-МОЁ! Точно так же, как в примере, только цикл не от 0 до Width, а
AS>> от x до x + Width.
RY> Пилять. Что вместо ??? надо.
Тебе-то какого эффекта надо, в конечном итоге? Кажется, уже в шестой раз за
тред спрашиваю.
С чего ты взял, прежде всего, что надо именно Me.PaintPicture
что_бы_тут_ни_было?

RY> Мне без разницы, как это будет выглядеть, и как делать, лишь бы оно могло
RY> a. Читать картинку
RY> b. Писать картинку
Какую, откуда, куда?
RY> Все.
LoadPicture, SavePicture не подходят? Под формулировку "a. Читать картинку b.
Писать картинку" - подходят.
Я не стебаюсь, я пытаюсь тебе объяснить, что ты _очень_ нечётко сформулировал
задачу. Я рад бы помочь с ней, да не могу, пока не пойму, чего тебе всё-таки
надо.

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

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


Re: Пpокpутка в TextBox

From: "A. Skrobov"

Hello, Albert!
You wrote in conference fido7.ru.visual.basic to "All"
to All on Wed, 14 Jul 2004 10:28:12 +0400:

AE> Вопpос №1:
AE> Как сделать, чтобы пpи добавлении текста скpолл автоматически
AE> пpокpучивался на самую нижнюю (последнюю) стpоку текстового поля?
Слать текстбоксу EM_LINESCROLL

AE> Вопpос №2:
AE> Реально ли сделать так, чтобы в обчном TextBox pазные части текста
AE> одновpеменно были отобpажены pазным цветом?
Имхо нет


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



--

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



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