南北汉子 发表于 2011-8-6 19:51:13

VB数组揭秘(od调试)

网上貌似没有VB数组调试相关的内容
我也是参看搜索的一些信息自己慢慢研究出来的
没地方发就发这好了

首先VB的类型都是作为Variant来表达,想在OD下了解Variant的具体含义就得先弄懂Variant的结构
下面是Variant的完整结构:
typedef struct tagVARIANT VARIANT;

struct tagVARIANT {
    union {
      struct __tagVARIANT {
            VARTYPE vt;
            WORD    wReserved1;
            WORD    wReserved2;
            WORD    wReserved3;
            union {
                LONG          lVal;         /* VT_I4                */
                BYTE          bVal;         /* VT_UI1               */
                SHORT         iVal;         /* VT_I2                */
                FLOAT         fltVal;       /* VT_R4                */
                DOUBLE      dblVal;       /* VT_R8                */
                VARIANT_BOOLboolVal;      /* VT_BOOL            */
                _VARIANT_BOOL bool;         /* (obsolete)         */
                SCODE         scode;      /* VT_ERROR             */
                CY            cyVal;      /* VT_CY                */
                DATE          date;         /* VT_DATE            */
                BSTR          bstrVal;      /* VT_BSTR            */
                IUnknown *    punkVal;      /* VT_UNKNOWN         */
                IDispatch *   pdispVal;   /* VT_DISPATCH          */
                SAFEARRAY *   parray;       /* VT_ARRAY      安全数组类型*/
                BYTE *      pbVal;      /* VT_BYREF|VT_UI1      */
                SHORT *       piVal;      /* VT_BYREF|VT_I2       */
                LONG *      plVal;      /* VT_BYREF|VT_I4       */
                FLOAT *       pfltVal;      /* VT_BYREF|VT_R4       */
                DOUBLE *      pdblVal;      /* VT_BYREF|VT_R8       */
                VARIANT_BOOL *pboolVal;   /* VT_BYREF|VT_BOOL   */
                _VARIANT_BOOL *pbool;       /* (obsolete)         */
                SCODE *       pscode;       /* VT_BYREF|VT_ERROR    */
                CY *          pcyVal;       /* VT_BYREF|VT_CY       */
                DATE *      pdate;      /* VT_BYREF|VT_DATE   */
                BSTR *      pbstrVal;   /* VT_BYREF|VT_BSTR   */
                IUnknown **   ppunkVal;   /* VT_BYREF|VT_UNKNOWN*/
                IDispatch **ppdispVal;    /* VT_BYREF|VT_DISPATCH */
                SAFEARRAY **pparray;      /* VT_BYREF|VT_ARRAY    */
                VARIANT *   pvarVal;      /* VT_BYREF|VT_VARIANT*/
                PVOID         byref;      /* Generic ByRef      */
                CHAR          cVal;         /* VT_I1                */
                USHORT      uiVal;      /* VT_UI2               */
                ULONG         ulVal;      /* VT_UI4               */
                INT         intVal;       /* VT_INT               */
                UINT          uintVal;      /* VT_UINT            */
                DECIMAL *   pdecVal;      /* VT_BYREF|VT_DECIMAL*/
                CHAR *      pcVal;      /* VT_BYREF|VT_I1       */
                USHORT *      puiVal;       /* VT_BYREF|VT_UI2      */
                ULONG *       pulVal;       /* VT_BYREF|VT_UI4      */
                INT *         pintVal;      /* VT_BYREF|VT_INT      */
                UINT *      puintVal;   /* VT_BYREF|VT_UINT   */
                struct __tagBRECORD {
                  PVOID         pvRecord;
                  IRecordInfo * pRecInfo;
                } __VARIANT_NAME_4;         /* VT_RECORD            */
            } __VARIANT_NAME_3;
      } __VARIANT_NAME_2;

      DECIMAL decVal;
    } __VARIANT_NAME_1;
};


第一个word是VARENUM常数下面列出VARENUM常数的结构和代表的含义

typedef unsigned short VARTYPE;

/*
* VARENUM usage key,
*
* * - may appear in a VARIANT
* * - may appear in a TYPEDESC
* * - may appear in an OLE property set
* * - may appear in a Safe Array
*
*
*VT_EMPTY                  nothing
*VT_NULL                   SQL style Null
*VT_I2               2 byte signed int
*VT_I4               4 byte signed int
*VT_R4               4 byte real
*VT_R8               8 byte real
*VT_CY               currency
*VT_DATE             date
*VT_BSTR             OLE Automation string
*VT_DISPATCH         IDispatch *
*VT_ERROR            SCODE
*VT_BOOL             True=-1, False=0
*VT_VARIANT          VARIANT *
*VT_UNKNOWN             IUnknown *
*VT_DECIMAL             16 byte fixed point
*VT_RECORD            user defined type
*VT_I1               signed char
*VT_UI1            unsigned char
*VT_UI2            unsigned short
*VT_UI4            unsigned short
*VT_I8                     signed 64-bit int
*VT_UI8                  unsigned 64-bit int
*VT_INT            signed machine int
*VT_UINT                unsigned machine int
*VT_VOID                      C style void
*VT_HRESULT                   Standard return type
*VT_PTR                     pointer type
*VT_SAFEARRAY               (use VT_ARRAY in VARIANT)
*VT_CARRAY                  C style array
*VT_USERDEFINED               user defined type
*VT_LPSTR                  null terminated string
*VT_LPWSTR               wide null terminated string
*VT_FILETIME                  FILETIME
*VT_BLOB                      Length prefixed bytes
*VT_STREAM                  Name of the stream follows
*VT_STORAGE                   Name of the storage follows
*VT_STREAMED_OBJECT         Stream contains an object
*VT_STORED_OBJECT             Storage contains an object
*VT_BLOB_OBJECT               Blob contains an object
*VT_CF                        Clipboard format
*VT_CLSID                     A Class ID
*VT_VECTOR                  simple counted array
*VT_ARRAY                     SAFEARRAY*
*VT_BYREF                     void* for local use
*VT_BSTR_BLOB                      Reserved for system use
*/

enum VARENUM
    {      VT_EMPTY      = 0,
      VT_NULL      = 1,
      VT_I2      = 2,
      VT_I4      = 3,
      VT_R4      = 4,
      VT_R8      = 5,
      VT_CY      = 6,
      VT_DATE      = 7,
      VT_BSTR      = 8,    字符串
      VT_DISPATCH      = 9,
      VT_ERROR      = 10,
      VT_BOOL      = 11,
      VT_VARIANT      = 12,
      VT_UNKNOWN      = 13,
      VT_DECIMAL      = 14,
      VT_I1      = 16,
      VT_UI1      = 17,
      VT_UI2      = 18,
      VT_UI4      = 19,
      VT_I8      = 20,
      VT_UI8      = 21,
      VT_INT      = 22,
      VT_UINT      = 23,
      VT_VOID      = 24,
      VT_HRESULT      = 25,
      VT_PTR      = 26,
      VT_SAFEARRAY      = 27,
      VT_CARRAY      = 28,
      VT_USERDEFINED      = 29,
      VT_LPSTR      = 30,
      VT_LPWSTR      = 31,
      VT_RECORD      = 36,
      VT_FILETIME      = 64,
      VT_BLOB      = 65,
      VT_STREAM      = 66,
      VT_STORAGE      = 67,
      VT_STREAMED_OBJECT      = 68,
      VT_STORED_OBJECT      = 69,
      VT_BLOB_OBJECT      = 70,
      VT_CF      = 71,
      VT_CLSID      = 72,
      VT_BSTR_BLOB      = 0xfff,
      VT_VECTOR      = 0x1000,
      VT_ARRAY      = 0x2000,   数组
      VT_BYREF      = 0x4000,
      VT_RESERVED      = 0x8000,
      VT_ILLEGAL      = 0xffff,
      VT_ILLEGALMASKED      = 0xfff,
      VT_TYPEMASK      = 0xfff
};


**** Hidden Message *****

liuyh7788 发表于 2011-12-11 10:41:43

学习一下,谢谢搂住
页: [1]
查看完整版本: VB数组揭秘(od调试)