找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5960|回复: 11

关于vb6.0的Variant结构体

[复制链接]
发表于 2019-8-28 20:12:40 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (ByVal dst As Long, ByVal src As Long, ByVal cBytes As Long)

Private Type mVar
    ty  As Integer '数据类型
    tyl As Integer '数据类型子类型
    tt  As Long    '备用 储存dec类型高32位
    lo  As Long    '数据 
    hi  As Long
End Type

Private Sub Form_Load()

    Dim ss As String
    Dim aa As Variant
    Dim bb As mVar

    aa = 5
    memcpy VarPtr(bb.ty), VarPtr(aa), 16
    bb.lo = 333
    memcpy VarPtr(aa), VarPtr(bb.ty), 16
    MsgBox aa

End Sub

本帖被以下淘专辑推荐:

回复

使用道具 举报

发表于 2019-8-30 03:25:57 | 显示全部楼层
原来如此,了解了
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2019-8-30 19:54:31 | 显示全部楼层
0xAA55 发表于 2019-8-30 03:25
原来如此,了解了

研究下每种类型以及子类型代表什么 虽然以前就知道这结构 但是一直没去解析 也没查到完整的资料
回复 赞! 靠!

使用道具 举报

发表于 2019-8-30 20:03:21 | 显示全部楼层
0xAA55 发表于 2019-8-30 03:25
原来如此,了解了

纳尼,A5大神居然现在才了解?我不是记得你以前在群里讨论过这个结构吗
回复 赞! 靠!

使用道具 举报

发表于 2019-8-31 06:25:45 | 显示全部楼层
系统消息 发表于 2019-8-30 20:03
纳尼,A5大神居然现在才了解?我不是记得你以前在群里讨论过这个结构吗

你记错了,我讨论的是SAFEARRAY
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2022-5-24 22:30:15 | 显示全部楼层
本帖最后由 Ayala 于 2022-5-24 23:20 编辑
0xAA55 发表于 2019-8-31 06:25
你记错了,我讨论的是SAFEARRAY


https://docs.microsoft.com/en-us ... dl/ns-oaidl-variant
找到微软官方的了

  1. typedef struct tagVARIANT {
  2.   union {
  3.     struct {
  4.       VARTYPE vt;
  5.       WORD    wReserved1;
  6.       WORD    wReserved2;
  7.       WORD    wReserved3;
  8.       union {
  9.         LONGLONG     llVal;
  10.         LONG         lVal;
  11.         BYTE         bVal;
  12.         SHORT        iVal;
  13.         FLOAT        fltVal;
  14.         DOUBLE       dblVal;
  15.         VARIANT_BOOL boolVal;
  16.         VARIANT_BOOL __OBSOLETE__VARIANT_BOOL;
  17.         SCODE        scode;
  18.         CY           cyVal;
  19.         DATE         date;
  20.         BSTR         bstrVal;
  21.         IUnknown     *punkVal;
  22.         IDispatch    *pdispVal;
  23.         SAFEARRAY    *parray;
  24.         BYTE         *pbVal;
  25.         SHORT        *piVal;
  26.         LONG         *plVal;
  27.         LONGLONG     *pllVal;
  28.         FLOAT        *pfltVal;
  29.         DOUBLE       *pdblVal;
  30.         VARIANT_BOOL *pboolVal;
  31.         VARIANT_BOOL *__OBSOLETE__VARIANT_PBOOL;
  32.         SCODE        *pscode;
  33.         CY           *pcyVal;
  34.         DATE         *pdate;
  35.         BSTR         *pbstrVal;
  36.         IUnknown     **ppunkVal;
  37.         IDispatch    **ppdispVal;
  38.         SAFEARRAY    **pparray;
  39.         VARIANT      *pvarVal;
  40.         PVOID        byref;
  41.         CHAR         cVal;
  42.         USHORT       uiVal;
  43.         ULONG        ulVal;
  44.         ULONGLONG    ullVal;
  45.         INT          intVal;
  46.         UINT         uintVal;
  47.         DECIMAL      *pdecVal;
  48.         CHAR         *pcVal;
  49.         USHORT       *puiVal;
  50.         ULONG        *pulVal;
  51.         ULONGLONG    *pullVal;
  52.         INT          *pintVal;
  53.         UINT         *puintVal;
  54.         struct {
  55.           PVOID       pvRecord;
  56.           IRecordInfo *pRecInfo;
  57.         } __VARIANT_NAME_4;
  58.       } __VARIANT_NAME_3;
  59.     } __VARIANT_NAME_2;
  60.     DECIMAL decVal;
  61.   } __VARIANT_NAME_1;
  62. } VARIANT;
复制代码


https://docs.microsoft.com/en-us ... 4-9d14-5425d3f5461f
  1. typedef  enum tagVARENUM
  2. {
  3.    VT_EMPTY = 0x0000,
  4.    VT_NULL = 0x0001,
  5.    VT_I2 = 0x0002,
  6.    VT_I4 = 0x0003,
  7.    VT_R4 = 0x0004,
  8.    VT_R8 = 0x0005,
  9.    VT_CY = 0x0006,
  10.    VT_DATE = 0x0007,
  11.    VT_BSTR = 0x0008,
  12.    VT_DISPATCH = 0x0009,
  13.    VT_ERROR = 0x000A,
  14.    VT_BOOL = 0x000B,
  15.    VT_VARIANT = 0x000C,
  16.    VT_UNKNOWN = 0x000D,
  17.    VT_DECIMAL = 0x000E,
  18.    VT_I1 = 0x0010,
  19.    VT_UI1 = 0x0011,
  20.    VT_UI2 = 0x0012,
  21.    VT_UI4 = 0x0013,
  22.    VT_I8 = 0x0014,
  23.    VT_UI8 = 0x0015,
  24.    VT_INT = 0x0016,
  25.    VT_UINT = 0x0017,
  26.    VT_VOID = 0x0018,
  27.    VT_HRESULT = 0x0019,
  28.    VT_PTR = 0x001A,
  29.    VT_SAFEARRAY = 0x001B,
  30.    VT_CARRAY = 0x001C,
  31.    VT_USERDEFINED = 0x001D,
  32.    VT_LPSTR = 0x001E,
  33.    VT_LPWSTR = 0x001F,
  34.    VT_RECORD = 0x0024,
  35.    VT_INT_PTR = 0x0025,
  36.    VT_UINT_PTR = 0x0026,
  37.    VT_ARRAY = 0x2000,
  38.    VT_BYREF = 0x4000
  39. } VARENUM;
复制代码


https://docs.microsoft.com/en-us ... d/vartype-constants
  1. Constant        Value        Description
  2. vbEmpty        0        Uninitialized (default)
  3. vbNull        1        Contains no valid data
  4. vbInteger        2        Integer
  5. vbLong        3        Long integer
  6. vbSingle        4        Single-precision floating-point number
  7. vbDouble        5        Double-precision floating-point number
  8. vbCurrency        6        Currency
  9. vbDate        7        Date
  10. vbString        8        String
  11. vbObject        9        Object
  12. vbError        10        Error
  13. vbBoolean        11        Boolean
  14. vbVariant        12        Variant (used only for arrays of variants)
  15. vbDataObject        13        Data access object
  16. vbDecimal        14        Decimal
  17. vbByte        17        Byte
  18. vbLongLong        20        LongLong integer (valid on 64-bit platforms only)
  19. vbUserDefinedType        36        Variants that contain user-defined types
  20. vbArray        8192        Array
复制代码
回复 赞! 靠!

使用道具 举报

发表于 2022-5-25 10:39:45 | 显示全部楼层
Ayala 发表于 2022-5-24 22:30
https://docs.microsoft.com/en-us/windows/win32/api/oaidl/ns-oaidl-variant
找到微软官方的了

这几个东西在 MSVC 的头文件里有。
回复 赞! 靠!

使用道具 举报

发表于 2025-9-19 14:07:59 | 显示全部楼层
本帖最后由 AyalaRs 于 2025-9-19 14:10 编辑
  1. Option Explicit

  2. ' Variable type constants
  3. Const vbEmpty As Integer = 0             ' Uninitialized (default)
  4. Const vbNull As Integer = 1              ' Contains no valid data
  5. Const vbInteger As Integer = 2           ' Integer
  6. Const vbLong As Integer = 3              ' Long integer
  7. Const vbSingle As Integer = 4            ' Single-precision floating-point number
  8. Const vbDouble As Integer = 5            ' Double-precision floating-point number
  9. Const vbCurrency As Integer = 6          ' Currency
  10. Const vbDate As Integer = 7              ' Date
  11. Const vbString As Integer = 8            ' String
  12. Const vbObject As Integer = 9            ' Object
  13. Const vbError As Integer = 10            ' Error
  14. Const vbBoolean As Integer = 11          ' Boolean
  15. Const vbVariant As Integer = 12          ' Variant (used only for arrays of variants)
  16. Const vbDataObject As Integer = 13       ' Data access object
  17. Const vbDecimal As Integer = 14          ' Decimal
  18. Const vbByte As Integer = 17             ' Byte
  19. Const vbLongLong As Integer = 20         ' LongLong integer (valid on 64-bit platforms only)
  20. Const vbUserDefinedType As Integer = 36  ' Variants that contain user-defined types
  21. Const vbArray As Integer = 8192          ' Array

  22. Private Declare Sub memcpy Lib "kernel32" Alias "RtlMoveMemory" (ByVal dst As Long, ByVal src As Long, ByVal cBytes As Long)


  23. Private Type mVar
  24.     ty  As Integer '数据类型
  25.     tyl As Integer '数据类型子类型
  26.     tt  As Long    '备用 储存dec类型高32位
  27.     lo  As Long    '数据
  28.     hi  As Long
  29. End Type


  30. Private Sub main()

  31.    
  32.     Dim a As Variant
  33.     Dim b As Variant
  34.    
  35.     Dim bb As mVar
  36.    
  37.     'bb.ty = &H15 '报错,提示不支持
  38.     bb.ty = vbDecimal
  39.    
  40.     bb.lo = &HFFFFFFF1
  41.     bb.hi = &HFFFFFFFF
  42.     bb.tt = 0
  43.     bb.tyl = 0
  44.    
  45.     memcpy VarPtr(a), VarPtr(bb.ty), 16
  46.    
  47.     bb.lo = &HFFFFFFF2
  48.     bb.hi = &HFFFFFFFF
  49.     bb.tt = 0
  50.     bb.tyl = 0
  51.    
  52.     memcpy VarPtr(b), VarPtr(bb.ty), 16
  53.    
  54.    
  55.     Debug.Print a
  56.     Debug.Print b
  57.    
  58.     MsgBox a + b

  59. End Sub


复制代码

好像没办法让vb6直接支持ULONGLONG @YY菌
回复 赞! 靠!

使用道具 举报

发表于 2025-9-22 10:11:17 | 显示全部楼层
AyalaRs 发表于 2025-9-19 14:07
好像没办法让vb6直接支持ULONGLONG @YY菌

你试试这个就晓得了:

  1. Option Explicit

  2. Private Declare Function PutMem2 Lib "msvbvm60" (ByRef Dst As Any, ByVal Src As Integer) As Long

  3. Private Sub Command1_Click()
  4.     Dim v As Variant
  5.     v = 1234567890@
  6.     PutMem2 v, 20
  7.     Print v
  8. End Sub
复制代码
回复 赞! 靠!

使用道具 举报

发表于 2025-9-22 14:51:32 | 显示全部楼层
YY菌 发表于 2025-9-22 10:11
你试试这个就晓得了:

看前面 20 是VBLONGLONG 21才是ULONGLONG
回复 赞! 靠!

使用道具 举报

发表于 2025-9-23 08:51:27 | 显示全部楼层
AyalaRs 发表于 2025-9-22 14:51
看前面 20 是VBLONGLONG 21才是ULONGLONG

?打印ULongLong还是可以的,但是做加法运算的时候报错了(说明oleaut32.dll的VarAdd函数实现了LongLong运算,没有实现ULongLong运算嘛)。
回复 赞! 靠!

使用道具 举报

发表于 2025-9-23 09:00:37 | 显示全部楼层
感谢大佬分享~~
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2025-12-2 18:43 , Processed in 0.038273 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表