`
mmdev
  • 浏览: 13301462 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)

阅读更多

如何在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 函数,下面分别是vb5vb6的定义:

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文件建立一个VB5VB6的类型库(.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)) 

分享到:
评论

相关推荐

    Sybex - Mastering Visual Basic .NET (VBL).pdf

    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) 文档

    **Visual Basic for Applications (VBA) 是一种编程语言,它被广泛应用于Microsoft Office套件中的应用程序,如Excel、Word、Access等。VBA允许用户创建自定义功能、宏和自动化工作流程,极大地提高了工作效率和数据...

    Microsoft - Microsoft Visual Basic 2010 Step by Step May 2010

    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 code" 指的是使用Visual Basic 6.0版本编写的程序代码。Visual Basic 6.0是该语言的一个经典版本,尽管现在已经被更新的.NET框架中的Visual Basic .NET所取代,但它仍然被许多企业和...

    Visual stdio2010关于c#4和Visual Basic10视频讲座

    《Visual Studio 2010 C# 4与Visual Basic 10 视频讲座》是一份详尽的教育资源,专为那些希望深入了解这两个编程语言及其在Visual Studio 2010中的新特性的开发者而设计。这个视频系列旨在帮助初学者和经验丰富的...

    beginning VisualBasic2010(英文版)入门必读

    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编程基础** Visual Basic .NET(VB.NET)是Microsoft开发的一种面向对象的编程语言,它是.NET框架的一部分,旨在提供一个简洁、高效且功能丰富的开发环境,尤其适合初学者入门。VB.NET沿袭了...

    Get a List of Windows Variables

    此外,`Form1.frm`、`Project1.vbp`和`Project1.vbw`是Visual Basic.NET项目中的文件。`Form1.frm`是窗体设计文件,定义了用户界面元素(如按钮)及其属性;`Project1.vbp`是项目文件,包含了项目的基本信息和引用库...

    变量Variables)1

    在Java这样的编程语言中,变量是用来表示数据的内存位置,这些数据可以随着时间变化。在本文中,我们将深入探讨变量的声明、作用以及自由变量和约束变量的区别。 首先,声明一个变量涉及到指定变量的类型和名称。...

    Calculus_of_Several_Variables.pdf

    根据提供的文件信息,我们可以推断出这是一本关于多变量微积分的教科书,名为《Calculus of Several Variables》,作者是Serge Lang,属于Springer出版的“Undergraduate Texts in Mathematics”系列之一。...

    Microsoft Visual Basic 2010 Step by Step

    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 ...

    Visual Basic.NET编程基础

    - **变量声明**:在VB.NET中,我们需要声明变量来存储数据,例如`Dim myVar As Integer`。 - **数据类型**:VB.NET支持多种数据类型,如整型(Integer)、浮点型(Double)、字符串(String)等。 - **控制流**:...

    Variables-and-Debugging.zip_visual c

    例如,局部变量只在函数内部可见,而全局变量在整个程序中都可访问。 5. **生命周期(Lifetime)**:变量的生命周期是从声明到其不再被引用的时间段。局部变量通常在函数结束时销毁,而全局变量在整个程序运行期间...

    vb应用程序举例——变量的生命周期

    在VB(Visual Basic)编程中,变量的生命周期是编程中非常关键的概念,它涉及到变量的创建、使用和销毁。变量的生命周期是指从变量被声明到它不再被使用并被系统回收的时间段。理解变量的生命周期有助于避免程序运行...

    matlab开发-搜索变量

    在MATLAB开发过程中,搜索变量是一项非常重要的任务,特别是在处理大量数据或复杂代码时。MATLAB提供了一些内置功能,使得用户能够有效地在`.mat`文件中查找和操作变量。本篇将详细介绍如何在MATLAB环境中搜索`.mat`...

    Visual Assist X特别补丁 V10.7.1903 绿色版 测试可用

    -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 ...

    。System_Variables_en系统变量.pdf

    系统变量在工业自动化领域中扮演着重要角色,它们是控制系统行为和状态的关键参数。在KUKA的系统中,这些变量允许用户调整和优化机器人的性能,监控系统的运行状态,以及解决潜在的问题。例如,某些系统变量可能用于...

    设置环境变量工具 NVM - eNvironment Variables Manager

    设置Windows环境变量工具 NVM - eNvironment Variables Manager 1.可以设置用户变量、系统变量,非常方便。 2.可以把环境变量导出成XML文件,不过不能导入 类似的工具有EnvMan,RapidEE。 此工具的源代码可以在...

    Introduction of several complex variables

    它们在多个复变量理论中扮演着基础角色,尤其是在处理复流形时。复流形是具有特定复结构的流形,这使得它们能够在局部上被描述为复坐标系下的开集。这种结构允许我们定义和研究在这些空间上的复解析函数,从而拓展了...

Global site tag (gtag.js) - Google Analytics