Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Вопрос для людей понимающих WinAPI Добавлено: 17.01.03 15:55  

Автор вопроса:  Андрей Щёкин [darxeth] | Web-сайт: www.livejournal.com/users/darxeth_digital | ICQ: 161560107 

Интересный вопрос:

Есть API-функция EnumDesktops. Её callback, EnumDesktopProc, в качестве первого параметра должен принимать строку. В VB мы пишем ByVal lpszDesktop As Long и тем самым получаем в этот параметр адрес строки (поскольку EnumDesktopsA, то ANSI-строки).

Я делаю в своей программе


Public Function EnumDesktopProc(ByVal lpszDesktop As Long, ByVal lParam As Long) As Long

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).

 

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 Zeus



ICQ: 161801353 

Вопросов: 63
Ответов: 220
 Web-сайт: apirussia.by.ru
 Профиль | | #1
Добавлено: 17.01.03 19:58

Тебя удивляет, что Функция работает при вызове её и с ByVal, и без ByVal? Ну так при объявлении функции ты уже указал ByVal

Ответить

Номер ответа: 2
Автор ответа:
 Андрей Щёкин [darxeth]



ICQ: 161560107 

Вопросов: 9
Ответов: 52
 Web-сайт: www.livejournal.com/users/darxeth_digital
 Профиль | | #2
Добавлено: 17.01.03 22:29

Нет, да такого я всё же способен додуматься.

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)

Строка передаваемая в таком случае ByVal = ASCIIZ. Строка, передаваемая ByRef = BSTR.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам