Передать pointer на свою структуру.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Передать pointer на свою структуру.

Сообщение SergeySV » 13.02.2004 (Пт) 12:43

Подскажите как лучше передать указатель на структуру в функцию API.

Когда например мы обрабатываем сообщение WM_ или функцию API, которая возвращает указатель (pointer) lParam, на структуру в памяти tNCR. То мы в VB делаем так:
1. создаем аналогичную пустую структуру
2. используем функцию CopyMemory lParam, ByVal tNCR, Len(tNCR) для заполнения нашей структуры по указателю lParam

Можно почти также и обратно запихнуть изменные нами данные в в первоначальную структуру: CopyMemory ByVal lParam, tNCR, Len(tNCR)

Но во всех этих вариантах винды уже создавали структуры, выделяли им память, а нам передавали указатель на нее.
А вот если мне надо наоборот, мне нужно создать структуру, заполнить ее и передать в функцию API указатель на мою структуру.... как это можно реализовать? Подскажите оптимальное решение?

У меня пока на выбор токо функции типа LocallAlloc...Free, HeapAlloc....Free, VirtualAllocEx ..... еще вроде через Shell32 - GetMalloc что-ли....... может я что-то упускаю, есть проще варианты?
Главное двигаться не быстрее, чем думает твоя голова.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 13.02.2004 (Пт) 12:53

Есть такая штука как AddressOf. Обычно ей и пользуются в таких случаях.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 13.02.2004 (Пт) 13:57

RayShade писал(а):Есть такая штука как AddressOf. Обычно ей и пользуются в таких случаях.


Пробовал я ее присобачить, но у меня во первых сложилось впечатление что это оператор только для функций..(хотя может я и ошибаюсь), но главное, у меня проблема немного посложнее:
Код: Выделить всё
Private Type NCCALCSIZE_PARAMS
   .......
   lppos As Long       'pointer на струк. WINDOWPOS
End Type

Private Type WINDOWPOS
   hwnd As Long
   .......
   flags As Long
End Type

И передать мне надо lParam, который является указателем (pоinter) на структ. NCCALCSIZE_PARAMS. Получается в одной структуре я должен сохранить указатель на другую.

Если подсунуть NCCALCSIZE_PARAMS через AddressOf еще можно:
SendMessage vchWnd, WM_NCCALCSIZE, True, AddressOf lParam
(надо еще проверить через Spy++ что там передаться)

то написать вот так:
Dim tWinpos as WINDOWPOS

With NCCALCSIZE_PARAMS
....
.lppos = AddressOf tWinpos
End With
для lppos компиллятор мне не дает.

Только конечно если через какй-нибудь вспомог. функцию все это провернуть.....?! попробую ща посмотреть
Главное двигаться не быстрее, чем думает твоя голова.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 13.02.2004 (Пт) 14:16

Неаа, ща еще раз проверил.
Не хочет AddressOf работать с типами, только с Sub, Function, Property

Кто еще что может предложить,.... так, по ходу дела
Главное двигаться не быстрее, чем думает твоя голова.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 13.02.2004 (Пт) 14:44

Мдам....
Значит:
обращение к COM SHGetMalloc (shell32) вызвал крах.
функ. LocalAlloc отработала нормально, но возвращенный ей адрес отвергла функция SendMessage и вызвала очередной крах...
Главное двигаться не быстрее, чем думает твоя голова.

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 13.02.2004 (Пт) 15:52

Блин, нет слов, перерыв MSDN, совершенно случайно наконец наткнулся на статью: http://msdn.microsoft.com/library/defau ... topic1.asp - Win32 API Programming with Visual Basic

из которой узнал, что оказывается есть такие замечательные недокументированные функции:

VarPtr, StrPtr

которые возвращают адрес: для VarPtr - адрес объектной переменной , StrPtr адрес строки сконв. в формат BSTR
Причем используя VarPtr можно получить адрес даже конкретного элемента своей структуры, а не только ее начало


Эти недокументированные функции валяются в скрытом модуле под названием, конечно же - _HiddenModule. Сделайте в свойствах Show Hidden Members и увидите его.

Ох уж это мелкософт... :wink:
Главное двигаться не быстрее, чем думает твоя голова.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.02.2004 (Пт) 16:02

:shock:
Рейшейду кол за незнание матчасти :twisted:

Структуры в VB передаются только по указателю и никак иначе. Поэтому объявление апишки типа
Код: Выделить всё
Declare Function CreateBrushIndirect Lib "gdi32" Alias "CreateBrushIndirect" (lpLogBrush As LOGBRUSH) As Long
суть передача указателя на структуру, и собственно всё.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

SergeySV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 124
Зарегистрирован: 17.04.2003 (Чт) 14:39
Откуда: Россия, Москва

Сообщение SergeySV » 13.02.2004 (Пт) 16:10

Хм, все.... то что API функции часто передают указатели на структуры я это знал давно и все время с ними работал,..............
но никогда до этого дня мне не приходилось создавать свою структуру и передавать API-функции указатель на нее, как это часто делает она сама (прошу не путать с заполнением структуры по указателю через CopyMemory)
Главное двигаться не быстрее, чем думает твоя голова.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: PetalBot и гости: 5

    TopList  
cron