如何在 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 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 中的数组作为 SAFEARRAYs 存储。为了 SAFEARRAY 结构的地址,您需要使用 VarPtrArray 函数。以下 Visual Basic 5.0 和 Visual Basic 6.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 UNICODE/ANSI 转换为字符串。如果数组的字符串使用 VarPtrArray 您将得到的数组的一个临时 ANSI 副本的地址。有关详细的信息,请参阅 VarPtrStringArray 函数。

StrPtr

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

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

示例:

Dim lngCharAddress as Long
Dim strMyVariable as String
strMyVariable = "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 String
Dim AddressOfArray As Long
MyArrayOfStrings(0)="AAA"
MyArrayOfStrings(1)="BBB"
AddressOfArray = VarPtrStringArray ( MyArrayOfStrings() )
				

ObjPtr

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

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

示例:

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

属性

文章编号: 199824 - 最后修改: 2004年7月1日 - 修订: 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
关键字:?
kbmt kbhowto KB199824 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 199824
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

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