如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
来源:互联网 发布:windows xp 耳机录音 编辑:程序博客网 时间:2024/05/16 16:20
如何在Visual Basic 中取得变量的内存地址(Address of Variables) |
本文适用于
- 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 中取得变量在内存中的地址(Address of Variables)
- 如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
- 如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
- 如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
- 如何在Visual Basic 中取得变量在内存中的地址(Addre
- 关于局部变量在内存中的地址
- 临时变量在内存中的地址分配
- 各类变量在内存中的地址分配
- java中变量在内存中的分配
- java中变量在内存中的分配
- 各种变量在内存中的高地址低地址问题
- 如何在piwik中获得用户变量(Custom Variables)
- 方法中的变量在调用该方法前在内存中并不存在
- 变量在内存中的形态
- 变量在内存中的位置
- 变量在内存中的存放
- 变量在内存中的存储
- 变量在内存中的区域
- 在 Windows XP Professional 上用 Visual Studio .NET 编写应用程序
- 程序员的灯下黑:“逗到底”的程序员
- 如果下属不服你怎么办?
- SaaS专题(四)--中小企业将对SaaS模式提出更高要求
- 关于飞机射击类游戏的设计原理 (加入时间:2001-3-4)
- 如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
- FCKEditor使用说明
- 程序员的灯下黑:不要忘记你的目标
- Windows XP网络修复的步骤
- 开源商业智能威胁传统市场
- 透视ITIL 3.0三大热点
- 插件开发招人及《开源人》征稿
- 《深入Spring2》第五章“AOP及在Spring中的应用”的电子版出来了
- 开源可视化 Python 性能调优工具 VPT 发布