如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
2007-12-17 10:36
369 查看
如何在VisualBasic中取得变量的内存地址(AddressofVariables) |
MicrosoftVisualBasicLearningEditionforWindows,versions5.0,6.0
MicrosoftVisualBasicProfessionalEditionforWindows,versions5.0,6.0
MicrosoftVisualBasicEnterpriseEditionforWindows,versions5.0,6.0
摘要
很少有vb程序员需要获得一个变量的低级信息,例如内存地址。然而,一些API函数需要这种信息,本文描述的方法可以帮助VB程序员取得这些信息
VarPtr-Returnstheaddressofavariable.返回变量的地址
VarPtrArray-Returnstheaddressofanarray.返回数组地址
StrPtr-ReturnstheaddressoftheUNICODEstringbuffer.返回UNICODE字符串缓冲区地址
VarPtrStringArray-Returnstheaddressofanarrayofstrings.
返回字符串数组地址
ObjPtr-Returnsthepointertotheinterfacereferencedbyanobjectvariable.返回一个对象的接口引用指针
正文
VarPtr
这个函数用来取得一个变量或一个数组的地址,传递一个变量名或者数组然后返回地址。但是,你要明白动态数组可能会被vb重新分配内存,因此你必须小心当你用VarPtr取得数组的地址的时候。
DimlngVariableAddressasLong
DimdblMyVariableasDouble
lngVariableAddress=VarPtr(dblMyVariable)
DimlngElementAddressasLong
DimlngArrayOfLongs(9)asLong
'followingwillgetaddressof4thelement
lngElementAddress=VarPtr(lngArrayOfLongs(3))
局限:这个函数不能用于取得数组的地址
VarPtrArray
当数组在VisualBasic中存为SAFEARRAYs结构时,要取得SAFEARRAYs结构的地址,你要使用VarPtrArray函数,下面分别是vb5、vb6的定义:
DeclareFunctionVarPtrArrayLib"msvbvm50.dll"Alias"VarPtr"_
(Var()asAny)AsLong
DeclareFunctionVarPtrArrayLib"msvbvm60.dll"Alias"VarPtr"_
(Var()asAny)AsLong
DimlngSafeArrayAddressasLong
DimlngArrayOfLongs(9)asLong
lngSafeArrayAddress=VarPtrArray(lngArrayOfLongs())
局限:VarPtrArray函数不能用于取得一个字符串数组的地址,因为vb会对字符串进行UNICODE/ANSI转换,如果对字符串数组使用VarPtrArray,将会得到一个临时ANSI数组拷贝的地址。
StrPtr
取得字符串第一个字符的地址DimlngCharAddressasLong
DimstrMyVariableasString
strMyVariable="SomeString"
lngCharAddress=StrPtr(strMyVariable)
当你在API调用中需要传递一个UNICODE字符串指针时可以使用这个函数
VarPtrStringArray
VarPtrStringArray用于取得字符串数组的地址。为了避免VB进行UNICODE/ANSI转换,它的声明必须在类型库中定义
你也可以使用midl编译器将下面的.odl文件编译成你自己的类型库:)
如果是VisualBasic5.0,建立一个文本文件名为VB6ptrlib.odl,内容如下:
#defineRTCALL_stdcall
[
uuid(C6799410-4431-11d2-A7F1-00A0C91110C3),
lcid(0),version(6.0),helpstring("VarPtrStringArraySupportforVB6")
]
libraryPtrLib
{
importlib("stdole2.tlb");
[dllname("msvbvm60.dll")]
moduleArrayPtr
{
[entry("VarPtr")]
longRTCALLVarPtrStringArray([in]SAFEARRAY(BSTR)*Ptr);
}
}
如果是VisualBasic5.0,建立一个文本文件名为VB5ptrlib.odl,内容如下:
#defineRTCALL_stdcall
[
uuid(6E814F00-7439-11D2-98D2-00C04FAD90E7),
lcid(0),version(5.0),helpstring("VarPtrStringArraySupportforVB5")
]
libraryPtrLib
{
importlib("stdole2.tlb");
[dllname("msvbvm50.dll")]
moduleArrayPtr
{
[entry("VarPtr")]
longRTCALLVarPtrStringArray([in]SAFEARRAY(BSTR)*Ptr);
}
}
在命令行使用MIDL编译器编译.ODL文件建立一个VB5或VB6的类型库(.TLB)
MIDL/tVB6ptrlib.odl
MIDL/tVB5ptrlib.odl
为了使用VarPtrStringArray你需要引用这个类型库
例子:
DimMyArrayOfStrings(2)AsString
DimAddressOfArrayAsLong
MyArrayOfStrings(0)="AAA"
MyArrayOfStrings(1)="BBB"
AddressOfArray=VarPtrStringArray(MyArrayOfStrings())
ObjPtr
ObjPtr返回一个object变量的地址objCollection.AddMyObj1,CStr(ObjPtr(MyObj1))
...
objCollection.RemoveCStr(ObjPtr(MyObj1))
Trackback:
相关文章推荐
- 如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
- 如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
- 如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
- 如何在Visual Basic 中取得变量在内存中的地址(Address of Variables)
- 如何在Visual Basic 中取得变量在内存中的地址(Addre
- page_address()函数分析--如何通过page取得虚拟地址
- page_address()函数分析--如何通过page取得虚拟地址
- page_address()函数分析--如何通过page取得虚拟地址
- page_address()函数分析--如何通过page取得虚拟地址
- page_address()函数分析--如何通过page取得虚拟地址
- page_address()函数分析--如何通过page取得虚拟地址
- page_address()函数分析--如何通过page取得虚拟地址
- PHP如何释放内存之unset销毁变量并释放内存详解
- 我也要学C语言-第六章:变量在内存中的地址与布局
- 如何从一个php文件向另一个地址post数据,不用表单和隐藏的变量
- 倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何查询某个变量的ADS地址
- 如何获取 程序加载后的内存起始地址
- 如何在ASP.Net中取得环境变量的值
- 如何取得所有的Session变量
- 如何获取 程序加载后的内存起始地址