Страница: 1 |
Интересный вопрос: Есть API-функция EnumDesktops. Её callback, EnumDesktopProc, в качестве первого параметра должен принимать строку. В VB мы пишем ByVal lpszDesktop As Long и тем самым получаем в этот параметр адрес строки (поскольку EnumDesktopsA, то ANSI-строки). Я делаю в своей программе Dim desktopName As String .... CopyMemory ByVal desktopName, ByVal lpszDesktop, Len(desktopName) ... End Function Это прекрасно работает, поскольку VB передаёт в качестве первого параметра ссылку на ASCIIZ (строку, завершённую Chr(0)). Тут всё ясно . Но, почему то, прекрасно работает и это: CopyMemory desktopName, lpszDesktop, Len(desktopName) Что это значит ? Получается, что мы передаём ссылку на строку OLE BSTR, которую ни одна API-функция не берёт и адрес адреса (ByRef lpszDesktop) того, откуда брать имя десктопа. Как это работает ??? Если написать ByVal lpszDesktop - вылетает, что логично (не нравится BSTR).
Тебя удивляет, что Функция работает при вызове её и с ByVal, и без ByVal? Ну так при объявлении функции ты уже указал ByVal Нет, да такого я всё же способен додуматься. Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long) Строка передаваемая в таком случае ByVal = ASCIIZ. Строка, передаваемая ByRef = BSTR. Страница: 1 |
Вопрос: Вопрос для людей понимающих WinAPI
Добавлено: 17.01.03 15:55
Автор вопроса: Андрей Щёкин [darxeth] | Web-сайт:
Public Function EnumDesktopProc(ByVal lpszDesktop As Long, ByVal lParam As Long) As Long
Ответы
Всего ответов: 2
Номер ответа: 1
Автор ответа:
Zeus
ICQ: 161801353
Вопросов: 63
Ответов: 220
Web-сайт:
Профиль | | #1
Добавлено: 17.01.03 19:58
Номер ответа: 2
Автор ответа:
Андрей Щёкин [darxeth]
ICQ: 161560107
Вопросов: 9
Ответов: 52
Web-сайт:
Профиль | | #2
Добавлено: 17.01.03 22:29