<iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog336280.html" frameborder="0" width="336" scrolling="no" height="280"></iframe>
如何在Visual Basic 中取得变量的内存地址(Address of Variables)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
本文适用于
- Microsoft Visual Basic Learning Edition for Windows, versions 5.0, 6.0
- Microsoft Visual Basic Professional Edition for Windows, versions 5.0, 6.0
- Microsoft Visual Basic Enterprise Edition for Windows, versions 5.0, 6.0
摘要
很少有vb程序员需要获得一个变量的低级信息,例如内存地址。然而,一些API函数需要这种
信息,本文描述的方法可以帮助VB程序员取得这些信息
VarPtr - Returns the address of a variable.返回变量的地址
VarPtrArray - Returns the address of an array.返回数组地址
StrPtr - Returns the address of the UNICODE string buffer.返回UNICODE字符串缓冲区地址
VarPtrStringArray - Returns the address of an array of strings.
返回字符串数组地址
ObjPtr - Returns the pointer to the interface referenced by an object variable. 返回一个对象的接口引用指针
正文
VarPtr
这个函数用来取得一个变量或一个数组的地址,传递一个变量名或者数组然后返回地址。但是,你要明白动态数组可能会被vb重新分配内存,因此你必须小心当你用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))
局限:这个函数不能用于取得数组的地址
VarPtrArray
当数组在Visual Basic中存为SAFEARRAYs结构时,要取得SAFEARRAYs结构的地址,你要使用VarPtrArray 函数,下面分别是vb5、vb6的定义:
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
Dim lngSafeArrayAddress as Long
Dim lngArrayOfLongs(9) as Long
lngSafeArrayAddress = VarPtrArray(lngArrayOfLongs())
局限:VarPtrArray函数不能用于取得一个字符串数组的地址,因为vb会对字符串进行UNICODE/ANSI转换,如果对字符串数组使用VarPtrArray,将会得到一个临时ANSI数组拷贝的地址。
StrPtr
取得字符串第一个字符的地址
Dim lngCharAddress as Long
Dim strMyVariable as String
strMyVariable = "Some String"
lngCharAddress = StrPtr(strMyVariable)
当你在API调用中需要传递一个UNICODE字符串指针时可以使用这个函数
VarPtrStringArray
VarPtrStringArray用于取得字符串数组的地址。为了避免VB 进行UNICODE/ANSI转换,
它的声明必须在类型库中定义
你也可以使用midl编译器将下面的.odl文件编译成你自己的类型库 :)
如果是
Visual Basic 5.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);
}
}
在命令行使用MIDL编译器编译.ODL文件建立一个VB5或VB6的类型库(.TLB)
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返回一个object变量的地址
objCollection.Add MyObj1, CStr(ObjPtr(MyObj1))
...
objCollection.Remove CStr(ObjPtr(MyObj1))
相关推荐
Visual Basic .NET is released shortly after the tenth anniversary of the first version of VB. The original language that changed the landscape of computing has lasted for 10 years and has enabled more...
**Visual Basic for Applications (VBA) 是一种编程语言,它被广泛应用于Microsoft Office套件中的应用程序,如Excel、Word、Access等。VBA允许用户创建自定义功能、宏和自动化工作流程,极大地提高了工作效率和数据...
Microsoft Visual Basic 2010 Step by Step 576 pages Publisher: Microsoft Press; 1 edition (May 7, 2010) Language: English ISBN-10: 0735626693 ISBN-13: 978-0735626690 Your hands-on, step-by-...
在本项目中,"visual basic code" 指的是使用Visual Basic 6.0版本编写的程序代码。Visual Basic 6.0是该语言的一个经典版本,尽管现在已经被更新的.NET框架中的Visual Basic .NET所取代,但它仍然被许多企业和...
《Visual Studio 2010 C# 4与Visual Basic 10 视频讲座》是一份详尽的教育资源,专为那些希望深入了解这两个编程语言及其在Visual Studio 2010中的新特性的开发者而设计。这个视频系列旨在帮助初学者和经验丰富的...
you′ll find that this book quickly gets you up to speed on what you need to know to get the most from Visual Basic 2010.Visual Basic 2010 offers a great deal of functionality in both tools and ...
**Visual Basic .NET编程基础** Visual Basic .NET(VB.NET)是Microsoft开发的一种面向对象的编程语言,它是.NET框架的一部分,旨在提供一个简洁、高效且功能丰富的开发环境,尤其适合初学者入门。VB.NET沿袭了...
此外,`Form1.frm`、`Project1.vbp`和`Project1.vbw`是Visual Basic.NET项目中的文件。`Form1.frm`是窗体设计文件,定义了用户界面元素(如按钮)及其属性;`Project1.vbp`是项目文件,包含了项目的基本信息和引用库...
在Java这样的编程语言中,变量是用来表示数据的内存位置,这些数据可以随着时间变化。在本文中,我们将深入探讨变量的声明、作用以及自由变量和约束变量的区别。 首先,声明一个变量涉及到指定变量的类型和名称。...
根据提供的文件信息,我们可以推断出这是一本关于多变量微积分的教科书,名为《Calculus of Several Variables》,作者是Serge Lang,属于Springer出版的“Undergraduate Texts in Mathematics”系列之一。...
Teach yourself the essential tools and techniques for Visual Basic® 2010-one step at a time. No matter what your skill level, you'll find the practical guidance and examples you need to start ...
- **变量声明**:在VB.NET中,我们需要声明变量来存储数据,例如`Dim myVar As Integer`。 - **数据类型**:VB.NET支持多种数据类型,如整型(Integer)、浮点型(Double)、字符串(String)等。 - **控制流**:...
例如,局部变量只在函数内部可见,而全局变量在整个程序中都可访问。 5. **生命周期(Lifetime)**:变量的生命周期是从声明到其不再被引用的时间段。局部变量通常在函数结束时销毁,而全局变量在整个程序运行期间...
在VB(Visual Basic)编程中,变量的生命周期是编程中非常关键的概念,它涉及到变量的创建、使用和销毁。变量的生命周期是指从变量被声明到它不再被使用并被系统回收的时间段。理解变量的生命周期有助于避免程序运行...
在MATLAB开发过程中,搜索变量是一项非常重要的任务,特别是在处理大量数据或复杂代码时。MATLAB提供了一些内置功能,使得用户能够有效地在`.mat`文件中查找和操作变量。本篇将详细介绍如何在MATLAB环境中搜索`.mat`...
-Very easy to use Microsoft Visual Studio plug-in, automatic identification of various keywords, system functions, member variables, automatically gives the input prompt, automatically corrects ...
系统变量在工业自动化领域中扮演着重要角色,它们是控制系统行为和状态的关键参数。在KUKA的系统中,这些变量允许用户调整和优化机器人的性能,监控系统的运行状态,以及解决潜在的问题。例如,某些系统变量可能用于...
设置Windows环境变量工具 NVM - eNvironment Variables Manager 1.可以设置用户变量、系统变量,非常方便。 2.可以把环境变量导出成XML文件,不过不能导入 类似的工具有EnvMan,RapidEE。 此工具的源代码可以在...
它们在多个复变量理论中扮演着基础角色,尤其是在处理复流形时。复流形是具有特定复结构的流形,这使得它们能够在局部上被描述为复坐标系下的开集。这种结构允许我们定义和研究在这些空间上的复解析函数,从而拓展了...