Страница: 1 |
Страница: 1 |
Вопрос: Почему lProcesses в EnumProcesses пустует ?
Добавлено: 12.06.11 16:00
Автор вопроса: Wlad | ICQ: 6977577
Собственно,такой код должен работать:
Private Declare Function EnumProcesses Lib "psapi.dll" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Dim aPID() As Long
ReDim aPID(255)
Dim lProcesses As Long
EnumProcesses(aPID(0), 1024, lProcesses)
Пример взят из VB6,но почему aPID(0) именно передается и почему 256 элементов всего - непонятно.Также функция должна возвращать Boolean,а там стоит Long...И в МСДН булеан.
Ответы
Всего ответов: 7
Номер ответа: 1
Автор ответа:
Ким Чен Ир
Вопросов: 0
Ответов: 140
Профиль | | #1
Добавлено: 12.06.11 19:34
Передается нулевой элемент массива, точнее его адрес в памяти. (ByRef lpidProcess As Long)
Зная его, функция заполнит адреса памяти последовательно, т.к. она предполагает, что программист удосужился выделить их.
И это сделано - ReDim aPID(255).
ByVal cb As Long = 1024 - это видимо длина массива в байтах (256 элементов * sizeof(long))
Проделав свою работу, функция передаст количество записанных байт в cbNeeded. Раздели на sizeof(long) - получишь количество заполненных элементов.
Тип возвращаемого значения BOOL - 32 битное целое, подойдет вообщем-то любой тип с той же длиной, но традиция...
Почему именно 256 элементов? Это наивное предположение о том, что в системе не может быть больше процессов.
Номер ответа: 2
Автор ответа:
Wlad
ICQ: 6977577
Вопросов: 3
Ответов: 9
Профиль | | #2
Добавлено: 12.06.11 20:22
Благодарю за объяснение,но всё равно почему-то в lProcesses сохраняется 0...
Номер ответа: 3
Автор ответа:
Wlad
ICQ: 6977577
Вопросов: 3
Ответов: 9
Профиль | | #3
Добавлено: 12.06.11 20:25
http://www.thescarms.com/vbasic/VB6vsVBNet.aspx Всё-таки тут на 8 умножать надо,а не на 4,как я думал...Но проблема всё та же(
Номер ответа: 4
Автор ответа:
Ким Чен Ир
Вопросов: 0
Ответов: 140
Профиль | | #4
Добавлено: 12.06.11 20:40
Ладно, блин, теперь по-русски: нет никакой проблемы!
тип лонг в вбнет - восемь байт, все декларации из вбшесть предполагают что лонг - четыре байта. Функция EnumProcesses тоже хочет 4 байта. Все объявления в вбнет смени лонг на интегер.
Номер ответа: 5
Автор ответа:
Wlad
ICQ: 6977577
Вопросов: 3
Ответов: 9
Профиль | | #5
Добавлено: 12.06.11 20:46
Эх,всё заработало,но всё равно в голове не укладывается... Ок,вернуло число 392 - это число,как я понимаю,DWORD типа.392/4 = число моих процессов в системе(1 процесс = 1 PID),или это другой какой-то PID ?
Номер ответа: 6
Автор ответа:
Ким Чен Ир
Вопросов: 0
Ответов: 140
Профиль | | #6
Добавлено: 12.06.11 20:51
Все верно, 1 процесс = 1 идентификатор. Это его уникальный номер, покуда жив процесс, система гарантирует, что дубля не будет.
Номер ответа: 7
Автор ответа:
Wlad
ICQ: 6977577
Вопросов: 3
Ответов: 9
Профиль | | #7
Добавлено: 12.06.11 20:58
Благодарю за ответ,тему можно закрыть = )).