Как получить адреса переменных в Visual Basic

Переводы статьи Переводы статьи
Код статьи: 199824 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Это редкий для программиста по Visual Basic можно получить сведения низкого уровня на переменную, например адрес в памяти. Однако существуют некоторые функции API, которые требуют такой информации. В данной статье описываются следующие функции Visual Basic, которые могут помочь программистам Visual Basic получения этой информации:

VarPtr - возвращает адрес переменной.

VarPtrArray - возвращает адрес массива.

StrPtr - возвращает адрес буфера строки ЮНИКОДА.

VarPtrStringArray - возвращает адрес массива строк.

ObjPtr - возвращает указатель на интерфейс, на который указывает объектная переменная.

Дополнительная информация

Предупреждение: один или несколько из следующих функций описанного в этой статье; VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, ObjPtr. Эти функции не поддерживаются службой технической поддержки корпорации Майкрософт. Они не были описаны в документации по Visual Basic и содержатся в статье базы знаний «как есть». Корпорация Майкрософт не гарантирует, что они будут доступны в будущих версиях Visual Basic.

VarPtr

Эта функция может использоваться для получения адреса переменной или элемент массива. Он принимает имя переменной или элемент массива в качестве параметра и возвращает адрес. Тем не менее следует иметь в виду, что разблокирован динамические массивы может перераспределить по Visual Basic, поэтому необходимо быть очень осторожным при использовании VarPtr для получения адреса элемента массива.

В следующем примере возвращается адрес переменной:

Dim lngVariableAddress as Long
Dim dblMyVariable as Double
lngVariableAddress = VarPtr(dblMyVariable)
				

В этом примере возвращается адрес четвертый элемент массива:

Dim lngElementAddress as Long
Dim lngArrayOfLongs(9) as Long
' following will get address of 4th element
lngElementAddress = VarPtr(lngArrayOfLongs(3))
				

Ограничения: функция VarPtr не может использоваться для получения адреса массива. Дополнительные сведения содержатся в разделе функции VarPtrArray.

VarPtrArray

Массивы в Visual Basic хранятся как объекты SAFEARRAY. Чтобы получить адрес структуры SAFEARRAY, необходимо использовать функцию VarPtrArray. Ниже приведены объявления в Visual Basic 6.0 и Visual Basic 5.0 соответственно.

Declare Function VarPtrArray Lib "msvbvm50.dll" Alias "VarPtr" _
(Var() as Any) As Long


Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" _
(Var() as Any) As Long
				

Чтобы получить адрес SAFEARRAY, передайте SAFEARRAY имя (включая скобки) функции VarPtrArray:

Dim lngSafeArrayAddress as Long
Dim lngArrayOfLongs(9) as Long
lngSafeArrayAddress = VarPtrArray(lngArrayOfLongs())
				

Ограничения: VarPtrArray функция не может использоваться для получения адреса элемента массива строк, так как Visual Basic не преобразования ЮНИКОДА или ANSI для строк. При использовании VarPtrArray на массив строк, вы получите адрес ANSI временную копию массива. Дополнительные сведения содержатся в разделе функции VarPtrStringArray.

StrPtr

Строки в Visual Basic хранятся в виде строки BSTR. При использовании VarPtr для переменной типа String, вы получите адрес BSTR, который является указатель на указатель строки. Чтобы получить адрес самого буфера строки, необходимо использовать функцию StrPtr. Эта функция возвращает адрес первого символа строки. Принять во внимание, что строки хранятся в формате Юникод в Visual Basic.

Чтобы получить адрес первого символа строки, передача строковой переменной функции StrPtr.

Пример:

Dim lngCharAddress as Long
Dim strMyVariable as String
strMyVariable = "Some String"
lngCharAddress = StrPtr(strMyVariable)
				

Эта функция используется, когда необходимо передать указатель на строку с UNIOCODE для вызова API.

VarPtrStringArray

VarPtrStringArray возвращает адрес массива строк. Чтобы избежать внутреннего преобразования ЮНИКОДА или ANSI, выполненных в Visual Basic, объявление имеет должен быть определен в библиотеке типов.

Кроме того с помощью компилятора MIDL для компиляции библиотеки типов из следующих файлов .odl.

Для Visual Basic 6.0 создайте текстовый файл с именем VB6ptrlib.odl, содержащий содержимое ниже:

#define RTCALL _stdcall
[
uuid(C6799410-4431-11d2-A7F1-00A0C91110C3),
lcid (0), version(6.0), helpstring("VarPtrStringArray Support for VB6")
]
library PtrLib
{
importlib ("stdole2.tlb");
[dllname("msvbvm60.dll")]
module ArrayPtr
   {
   [entry("VarPtr")]
   long RTCALL VarPtrStringArray([in] SAFEARRAY (BSTR) *Ptr);
   }
}
				

Для Visual Basic 5.0 создайте текстовый файл с именем VB5ptrlib.odl, содержащий содержимое ниже:

#define RTCALL _stdcall
[
uuid(6E814F00-7439-11D2-98D2-00C04FAD90E7),
lcid (0), version(5.0), helpstring("VarPtrStringArray Support for VB5")
]
library PtrLib
{
importlib ("stdole2.tlb");
[dllname("msvbvm50.dll")]
module ArrayPtr
   {
   [entry("VarPtr")]
   long RTCALL VarPtrStringArray([in] SAFEARRAY (BSTR) *Ptr);
   }
}
				

Используйте следующие команды для компиляции файлов предыдущей .odl с помощью компилятора MIDL для создания файл библиотеки (с расширением TLB) типов Visual Basic 6.0 и Visual Basic 5.0 соответственно:

MIDL /t VB6ptrlib.odl MIDL /t VB5ptrlib.odl

Функция VarPtrStringArray используется в проекте, необходимо создать ссылку на библиотеку типов, которую вы только что создали.

Пример:

Dim MyArrayOfStrings(2) As String
Dim AddressOfArray As Long
MyArrayOfStrings(0)="AAA"
MyArrayOfStrings(1)="BBB"
AddressOfArray = VarPtrStringArray ( MyArrayOfStrings() )
				

ObjPtr

ObjPtr принимает имя переменной объекта как параметр и получает адрес интерфейса ссылается эта переменная объекта.

Один сценарий использования этой функции — при необходимости сделать коллекцию объектов. Индексирование объекта, используя его адрес в качестве ключа, позволяет получить быстрый доступ к объекту чем прохода по коллекции и с помощью оператора Is. Во многих случаях адрес объекта является единственным надежным, что следует использовать в качестве ключа.

Пример:

objCollection.Add MyObj1, CStr(ObjPtr(MyObj1))
...
objCollection.Remove CStr(ObjPtr(MyObj1))
				

Свойства

Код статьи: 199824 - Последний отзыв: 1 ноября 2013 г. - Revision: 5.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
Ключевые слова: 
kbhowto kbmt KB199824 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Данная статья переведена с использованием программного обеспечения Майкрософт для машинного перевода и, возможно, отредактирована посредством технологии Community Translation Framework (CTF). Корпорация Майкрософт предлагает вам статьи, обработанные средствами машинного перевода, отредактированные членами сообщества Майкрософт и переведенные профессиональными переводчиками, чтобы вы могли ознакомиться со всеми статьями нашей базы знаний на нескольких языках. Статьи, переведенные с использованием средств машинного перевода и отредактированные сообществом, могут содержать смысловое, синтаксические и (или) грамматические ошибки. Корпорация Майкрософт не несет ответственности за любые неточности, ошибки или ущерб, вызванные неправильным переводом контента или его использованием нашими клиентами. Подробнее об CTF можно узнать по адресу http://support.microsoft.com/gp/machine-translation-corrections/ru.
Эта статья на английском языке: 199824

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com