PutMemVar PutMemStr PutMemObj GetMemVar GetMemStr GetMemObj

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 104
Зарегистрирован: 29.01.2016 (Пт) 17:42

PutMemVar PutMemStr PutMemObj GetMemVar GetMemStr GetMemObj

Сообщение nouyana » 25.04.2017 (Вт) 7:42

Возвращаюсь к теме об указателях. В Популярных вопросах эта тема, вроде как, освещена уже *дцать лет тому назад, однако у меня пользоваться функциями PutMemVar, PutMemStr, PutMemObj, GetMemVar, GetMemStr и GetMemObj не получается. Собственно, листинг с комментариями:
Код: Выделить всё
Declare Function PutMemVar Lib "msvbvm60" _
   (ByVal pDst As Long, ByRef NewVar As Variant) As Long
Declare Function PutMemStr Lib "msvbvm60" _
   (ByVal pDst As Long, ByRef NewStr As String) As Long
Declare Function PutMemObj Lib "msvbvm60" _
   (ByVal pDst As Long, ByRef NewObj As Object) As Long
Declare Function GetMemVar Lib "msvbvm60" _
   (ByVal pSrc As Long, ByRef MyVar As Variant) As Long
Declare Function GetMemStr Lib "msvbvm60" _
   (ByVal pSrc As Long, ByRef MyStr As String) As Long
Declare Function GetMemObj Lib "msvbvm60" _
   (ByVal pSrc As Long, ByRef MyObj As Object) As Long

Sub Main()
   Dim var     As Variant
   Dim new_var As Variant
   Dim str     As String
   Dim new_str As String
   Dim obj     As Object
   Dim new_obj As Object
   
   var = 1
   new_var = 2
   PutMemVar VarPtr(var), new_var
   Debug.Print var           'Работает. Вернул 2
   
   Set obj = New Collection
   Set new_obj = New StdPicture
   PutMemObj ObjPtr(obj), new_obj
   Debug.Print TypeName(obj) 'Не работает. Вернул "Collection"
                             'вместо "StdPicture"
   Set obj = Nothing
   Set new_obj = Nothing
   
'   str = "A"
'   new_str = "B"
'                             'Дальше Run-time error '0'
'   PutMemStr StrPtr(str), new_str
'   Debug.Print str           'Хочу получить "B"
   
   var = 1
   new_var = 2
   GetMemVar VarPtr(new_var), var
   Debug.Print var           'Работает. Вернул 2
   
'   Set obj = New Collection
'   Set new_obj = New StdPicture
'                             'Дальше Run-time error '0'
'   GetMemObj ObjPtr(new_obj), obj
'   Debug.Print TypeName(obj) 'Хочу получить "StdPicture"
'   Set obj = Nothing
'   Set new_obj = Nothing
   
'   str = "A"
'   new_str = "B"
'                             'Дальше Run-time error '0'
'   GetMemStr StrPtr(new_str), str
'   Debug.Print str           'Хочу получить "B"
End Sub


Как заставить эти функции работать?

PS
Если кому-то известно как работать с SetMemObj, SetMemVar, SetMemEvent, GetMemEvent, PutMemEvent, GetMemNewObj, PutMemNewObj, SetMemNewObj, о которых упоминал Viper, пишите сюда же.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: PutMemVar PutMemStr PutMemObj GetMemVar GetMemStr GetMem

Сообщение Хакер » 25.04.2017 (Вт) 19:32

Тут требуется целая статья, я думаю.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 104
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: PutMemVar PutMemStr PutMemObj GetMemVar GetMemStr GetMem

Сообщение nouyana » 26.04.2017 (Ср) 7:58

Хакер писал(а):Тут требуется целая статья, я думаю.
В интернете на эту тему не нашёл ни слова, поэтому такая статья, если она будет, будет первой. Если же тебе время не позволяет писать статью, то можешь просто подправить код из первого поста так чтобы он работал - это тоже будет полезно многим.

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 104
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: PutMemVar PutMemStr PutMemObj GetMemVar GetMemStr GetMem

Сообщение nouyana » 28.04.2017 (Пт) 22:47

С функцией GetMemStr разобрался. Указатель на строку надо было получать не при помощи StrPtr, а при помощи VarPtr:
Код: Выделить всё
Declare Function GetMemStr Lib "msvbvm50" _
   (ByVal pSrc As Long, ByRef MyStr As String) As Long
Sub Main()
   Dim str     As String
   Dim new_str As String
   str = "A"
   new_str = "B"
   GetMemStr VarPtr(new_str), str
   Debug.Print str           'Получаем "B"
End Sub

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 104
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: PutMemVar PutMemStr PutMemObj GetMemVar GetMemStr GetMem

Сообщение nouyana » 28.04.2017 (Пт) 23:09

С PutMemStr тоже разобрался. Помимо того, что указатель, как и в случае с GetMemStr, должен быть получен при помощи VarPtr, необходимо помнить, что строки, переданные во внешние библиотеки всегда преобразуются из Unicode в ANSI:
Код: Выделить всё
Declare Function PutMemStr Lib "msvbvm60" _
   (ByVal pDst As Long, ByVal NewStr As String) As Long
Sub Main()
   Dim str     As String
   Dim new_str As String
   str = "A"
   new_str = "B"
   'В следующей строке new_str будет передана ByVal
   'во внешнюю библиотеку и по дороге преобразована
   'из Unicode в ANSI. После этого, преобразованная
   'ANSI-строка будет присвоена переменной str по
   'указателю, полученному с помощью VarPtr:
   PutMemStr VarPtr(str), new_str
   'Перед дальнейшим использованием строку снова надо
   'сделать юникодной:
   str = StrConv(str, vbUnicode)
   Debug.Print str 'Получаем "B"
End Sub

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 104
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: PutMemVar PutMemStr PutMemObj GetMemVar GetMemStr GetMem

Сообщение nouyana » 28.04.2017 (Пт) 23:15

С GetMemObj была та же проблема, что и с GetMemStr - необходимо использовать VarPtr вместо ObjPtr:
Код: Выделить всё
Declare Function GetMemObj Lib "msvbvm60" _
   (ByVal pSrc As Long, ByRef MyObj As Object) As Long
Sub Main()
   Dim obj     As Object
   Dim new_obj As Object
   Set obj = New Collection
   Set new_obj = New StdPicture
   GetMemObj VarPtr(new_obj), obj
   Debug.Print TypeName(obj) 'Получаем "Picture"
   Set obj = Nothing
   Set new_obj = Nothing
End Sub

nouyana
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 104
Зарегистрирован: 29.01.2016 (Пт) 17:42

Re: PutMemVar PutMemStr PutMemObj GetMemVar GetMemStr GetMem

Сообщение nouyana » 28.04.2017 (Пт) 23:27

Итого: пока не работает только PutMemObj. Плюс нужно разобраться с тем, что такое SetMemObj, SetMemVar, SetMemEvent, GetMemEvent, PutMemEvent, GetMemNewObj, PutMemNewObj, SetMemNewObj


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11

    TopList