你目前正处于脱机状态,正在等待 Internet 重新连接

如何在 Visual Basic 中获取变量的地址

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 199824
本文已归档。它按“原样”提供,并且不再更新。
概要
它是正常的现象 Visual Basic 程序员能够需要获取变量,如它的内存地址的低级别信息。但是,有一些需要此类信息的 API 函数。本文介绍以下有助于获得此信息是 Visual Basic 程序员 Visual Basic 函数:

VarPtr-返回变量的地址。

VarPtrArray-返回数组的地址。

StrPtr-返回的 UNICODE 字符串缓冲区的地址。

VarPtrStringArray-返回的字符串数组的地址。

ObjPtr-返回到一个对象变量引用的接口指针。
更多信息
警告: 一个或多个以下的函数将在本文中 ; 讨论 VarPtr,VarPtrArray,VarPtrStringArray,StrPtr,ObjPtr。这些函数不受 Microsoft 技术支持。它们不记录在 Visual Basic 文档并提供了这篇知识库文章"按原样。Microsoft 不能保证它们将在将来的版本的 Visual Basic 中可用。

VarPtr

此函数可用于获取变量或数组元素的地址。它获取变量的名称或作为参数数组元素,并返回地址。但是,您应该知道重新的未锁定的动态数组可能被分配由 Visual Basic 因此您必须非常小心使用 VarPtr 获取数组元素的地址时。

下面的示例获取变量的地址:

Dim lngVariableAddress as LongDim dblMyVariable as DoublelngVariableAddress = VarPtr(dblMyVariable)				

本示例获取数组中的第四个元素的地址:

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

限制: VarPtr 函数不能用于获取数组中的地址。有关详细的信息,请参阅 VarPtrArray 函数。

VarPtrArray

在 Visual Basic 中的数组作为 SAFEARRAYs 存储。为了 SAFEARRAY 结构的地址,您需要使用 VarPtrArray 函数。以下 Visual Basic 5.0 和 Visual Basic 6.0 中声明分别是:

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

若要将地址的一个 SAFEARRAY SAFEARRAY 名称 (包括在括号) 传递给 VarPtrArray 函数:

Dim lngSafeArrayAddress as LongDim lngArrayOfLongs(9) as LonglngSafeArrayAddress = VarPtrArray(lngArrayOfLongs())				

限制: VarPtrArray 函数不能用于获取由数组组成的字符串,地址因为 Visual Basic UNICODE/ANSI 转换为字符串。如果数组的字符串使用 VarPtrArray 您将得到的数组的一个临时 ANSI 副本的地址。有关详细的信息,请参阅 VarPtrStringArray 函数。

StrPtr

在 Visual Basic 中的字符串将存储为 BSTR 的。如果 String 类型的变量使用了 VarPtr 您将得到该 BSTR 这是一个指向字符串的指针的指针的地址。若要将字符串缓冲区本身的地址,您需要使用 StrPtr 函数。此函数返回字符串的第一个字符的地址。考虑到字符串将存储为 Visual Basic 中的 UNICODE。

若要将字符串的第一个字符的地址将传递给 StrPtr 函数,该字符串变量。

示例:

Dim lngCharAddress as LongDim strMyVariable as StringstrMyVariable = "Some String"lngCharAddress = StrPtr(strMyVariable)				

当您需要将指针传递给 API 调用的 UNIOCODE 字符串时,您可以使用此函数。

VarPtrStringArray

VarPtrStringArray 获取由数组组成的字符串地址。若要不必固有的 UNICODE/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 编译器分别创建一个 Visual Basic 6.0 中或 Visual Basic 5.0 的类型库 (.tlb) 文件:

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

要在项目中使用 VarPtrStringArray 函数,您需要创建对您刚刚创建的类型库的引用。

示例:

Dim MyArrayOfStrings(2) As StringDim AddressOfArray As LongMyArrayOfStrings(0)="AAA"MyArrayOfStrings(1)="BBB"AddressOfArray = VarPtrStringArray ( MyArrayOfStrings() )				

ObjPtr

ObjPtr 采用对象变量的名称作为参数,并获取该对象变量引用的接口的地址。

使用此函数的一种情况是当您需要执行由对象所组成的集合,该集合中的对象。通过索引键中使用其地址将对象,可获得更快地访问该对象不是遍历该集合和使用该运算符。在许多的情况对象的地址是用于为键仅可靠的事情。

示例:

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

警告:本文已自动翻译

属性

文章 ID:199824 - 上次审阅时间:12/05/2015 10:25:44 - 修订版本: 2.1

Microsoft Visual Basic 5.0 学习版, Microsoft Visual Basic 6.0 学习版, Microsoft Visual Basic 5.0 专业版, Microsoft Visual Basic 6.0 专业版, Microsoft Visual Basic 5.0 企业版, Microsoft Visual Basic Enterprise Edition for Windows 6.0

  • kbnosurvey kbarchive kbmt kbhowto KB199824 KbMtzh
反馈