请教:关于SafeArray与Variant的一些问题

yixingpo 2015-09-29 11:08:06
记得有位大神说过VB里面定义不出真实数组,其实都是SafeArray的指针。
关于数值类的SaveArray都一样的。
关键在于String、Variant的变量数组的SaveArray理解不透。还有就是SafeArray里面的fFeatures(数组特性)理解不了。
大家有相关推荐资料么?在百度实在百度不到了。

疑惑一:
Sub Test()
ReDim a$(8)
CopyMemory p&, ByVal VarPtrArray(a), 4
CopyMemory fFeatures%, ByVal p + 2, 2
CopyMemory member&, ByVal p + 16, 4
Debug.Print fFeatures
End Sub
想要定义一个变长数组,然而却发现得不到数组的SafeArray的地址指针,运行后竟然得不到地址(p值为0)?
其他类型如Long,Interger,Variant等都可以的,甚至是我如果改为定长数组Dim a$(8),都可以获得p值。
莫非ReDim a$(8)是个真实数组?

疑惑二:
可以解释一下SafeArray的fFeatures数值的含义么?
例如:定义为定长数值数组,返回是146。
定义为变长数值数组,返回是128。
定义为定长Variant数组,返回是2194。
等等……
我想fFeatures中似乎有个结构体类似东西吧?

疑惑三:
Variant的内部结构有么?
即能表达字符串,数值,又能表达Object。
相信一定会是很复杂的结构吧。

以上疑问实在百度不到,分数又少,真心求教。谢谢各位大神解惑。
...全文
208 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2015-09-30
  • 打赏
  • 举报
回复
先下载、再引用啊。
赵4老师 2015-09-29
  • 打赏
  • 举报
回复
学会使用WinDbg是楼主的当务之急。 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
yixingpo 2015-09-29
  • 打赏
  • 举报
回复
引用 2 楼 Tiger_Zhao 的回复:
一、Exposing undocumented memory access functions in Visual Basic 6 到这个页面中去下载VBVM6Lib.tlb,引用它,用 SAPtr/StrSAPtr 可以直接得到指针地址。
Option Explicit

Private Type SAFEARRAY1D
    cDims As Integer
    fFeatures As Integer
    cbElements As Long
    cLocks As Long
    pvData As Long
    cElements As Long
    lLbound As Long
End Type

Sub Main()
    Test
End Sub

Sub Test()
    ReDim a(8) As String
    ReDim b(8) As Integer
    Dim c(8) As Integer
    Dim d(8) As Variant
    
    PrintSA "变长String", StrSAPtr(a)
    PrintSA "变长Integer", SAPtr(b)
    PrintSA "定长Integer", SAPtr(c)
    PrintSA "定长Variant", SAPtr(d)
End Sub

Sub PrintSA(ByVal memo As String, ByVal ptr As Long)
    Dim tSA As SAFEARRAY1D
    CopyMemory tSA, ByVal ptr, Len(tSA)
    
    Debug.Print memo, "&H" & Hex(tSA.fFeatures), tSA.fFeatures
End Sub
变长String    &H180          384 
变长Integer   &H80           128 
定长Integer   &H92           146 
定长Variant   &H892          2194 
二、MSDN直接有说明啊 SAFEARRAY structure
最最后后一次麻烦大神 由于是用VBA编写的,只能苦B的用Varptr或Strptr等,找不到VBVM6Lib.tlb,是引用么?或是可以用API先声明一下?
Tiger_Zhao 2015-09-29
  • 打赏
  • 举报
回复
用 Variant 啊。
yixingpo 2015-09-29
  • 打赏
  • 举报
回复
引用 3 楼 Tiger_Zhao 的回复:
三、还是MSDN VARIANT and VARIANTARG 技术问题查百度
谢谢,知道查找地址了,很有用。 题外话,vb可以根据某些情况选择性定义数据类型么 例如下面的意思: Sub Test() i = 2 If i = 1 Then Dim hh As Integer Else Dim hh As Double End If End Sub 运行肯定是错的,只是这个意思
Tiger_Zhao 2015-09-29
  • 打赏
  • 举报
回复
三、还是MSDN
VARIANT and VARIANTARG

技术问题查百度
Tiger_Zhao 2015-09-29
  • 打赏
  • 举报
回复
一、Exposing undocumented memory access functions in Visual Basic 6
到这个页面中去下载VBVM6Lib.tlb,引用它,用 SAPtr/StrSAPtr 可以直接得到指针地址。
Option Explicit

Private Type SAFEARRAY1D
cDims As Integer
fFeatures As Integer
cbElements As Long
cLocks As Long
pvData As Long
cElements As Long
lLbound As Long
End Type

Sub Main()
Test
End Sub

Sub Test()
ReDim a(8) As String
ReDim b(8) As Integer
Dim c(8) As Integer
Dim d(8) As Variant

PrintSA "变长String", StrSAPtr(a)
PrintSA "变长Integer", SAPtr(b)
PrintSA "定长Integer", SAPtr(c)
PrintSA "定长Variant", SAPtr(d)
End Sub

Sub PrintSA(ByVal memo As String, ByVal ptr As Long)
Dim tSA As SAFEARRAY1D
CopyMemory tSA, ByVal ptr, Len(tSA)

Debug.Print memo, "&H" & Hex(tSA.fFeatures), tSA.fFeatures
End Sub

变长String    &H180          384 
变长Integer &H80 128
定长Integer &H92 146
定长Variant &H892 2194


二、MSDN直接有说明啊
SAFEARRAY structure

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧