1 ;---------------------------------------------------------------
2 ; This comment block added by the CLR dev team.
4 ; This is a custom autoexp.dat that causes VS2005 to nicely
5 ; pretty-print common CLR data types (MethodDesc, EEClass, etc.)
6 ; in the debugger watch window. For example, instead of
11 ; you will see the more useful
13 ; pString {0x<addr> "Hello" }
18 ; To use this file, replace the autoexp.dat file in your VS
19 ; installation with this one. This file is normally found under
22 ; C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger
24 ; If you have your own custom rules that you don't want messed
25 ; up or you're just healthily paranoid, you can cut and paste
26 ; the CLR-specific section only. The section begins with
28 ; ;---- [BEGIN] CLR-specific autoexps ---------------------------
32 ; ;---- [END] CLR-specific autoexps ---------------------------
34 ; Note that this *must* go into the [AutoExpand] section of the file.
35 ; Don't just append to the end of the file or the debugger won't
40 ;---------------------------------------------------------------
49 ;---------------------------------------------------------------
50 ; AutoExp.Dat - templates for automatically expanding data
51 ; Licensed to the .NET Foundation under one or more agreements.
52 ; The .NET Foundation licenses this file to you under the MIT license.
53 ; See the LICENSE file in the project root for more information.
54 ;---------------------------------------------------------------
56 ; While debugging, Data Tips and items in the Watch and Variable
57 ; windows are automatically expanded to show their most important
58 ; elements. The expansion follows the format given by the rules
59 ; in this file. You can add rules for your types or change the
62 ; For good examples, read the rules in this file.
64 ; To find what the debugger considers the type of a variable to
65 ; be, add it to the Watch window and look at the Type column.
67 ; An AutoExpand rule is a line with the name of a type, an equals
68 ; sign, and text with replaceable parts in angle brackets. The
69 ; part in angle brackets names a member of the type and an
70 ; optional Watch format specifier.
72 ; AutoExpand rules use the following syntax. The equals sign (=),
73 ; angle brackets (<>), and comma are taken literally. Square
74 ; brackets ([]) indicate optional items.
76 ; type=[text]<member[,format]>...
78 ; type Name of the type (may be followed by <*> for template
79 ; types such as the ATL types listed below).
81 ; text Any text.Usually the name of the member to display,
82 ; or a shorthand name for the member.
84 ; member Name of a member to display.
86 ; format Watch format specifier. One of the following:
88 ; Letter Description Sample Display
89 ; ------ -------------------------- ------------ -------------
90 ; d,i Signed decimal integer 0xF000F065,d -268373915
91 ; u Unsigned decimal integer 0x0065,u 101
92 ; o Unsigned octal integer 0xF065,o 0170145
93 ; x,X Hexadecimal integer 61541,X 0X0000F065
94 ; l,h long or short prefix for 00406042,hx 0x0c22
96 ; f Signed floating-point 3./2.,f 1.500000
97 ; e Signed scientific-notation 3./2.,e 1.500000e+000
98 ; g Shorter of e and f 3./2.,g 1.5
99 ; c Single character 0x0065,c 'e'
100 ; s Zero-terminated string pVar,s "Hello world"
101 ; su Unicode string pVar,su "Hello world"
103 ; For details of other format specifiers see Help under:
104 ; "format specifiers/watch variable"
106 ; The special format <,t> specifies the name of the most-derived
107 ; type of the object. This is especially useful with pointers or
108 ; references to a base class.
110 ; If there is no rule for a class, the base classes are checked for
113 ; There are some special entries allowed in the AutoExpand section:
114 ; $BUILTIN is used to display more complex types that need to do more
115 ; than just show a member variable or two.
116 ; $ADDIN allows external DLLs to be added to display even more complex
117 ; types via the EE Add-in API. The first argument is the DLL name, the
118 ; second argument is the name of the export from the DLL to use. For
119 ; further information on this API see the sample called EEAddIn.
121 ; WARNING: if hexadecimal mode is on in the watch window, all numbers here are
122 ; evaluated in hex, e.g. 42 becomes 0x42
126 ;---- [BEGIN] CLR-specific autoexps ---------------------------
130 PEFile=<m_pDebugName,su>
131 Module=<m_file->m_pDebugName, su>
132 Assembly=<m_pManifestFile->m_pDebugName,su>
133 ClassLoader=<m_pAssembly->m_pManifestFile->m_pDebugName,su>
134 AssemblySpec=<m_pAssemblyName,s> v<m_context.usMajorVersion,d>.<m_context.usMinorVersion,d>.<m_context.usBuildNumber,d>.<m_context.usRevisionNumber,d> <m_CodeInfo.m_pszCodeBase,su>
136 TypeHandle=<m_asMT->m_pEEClass->m_szDebugClassName,s>
137 ParamTypeDesc=<m_TemplateMT->m_pEEClass->m_szDebugClassName, s>
140 EEClass=<m_szDebugClassName,s>
141 MethodTable=<m_pEEClass->m_szDebugClassName,s>
142 MethodDesc=<m_pszDebugClassName,s>::<m_pszDebugMethodName,s>
143 ReflectMethod=<pMethod->m_pszDebugClassName,s>::<pMethod->m_pszDebugMethodName,s>
144 FieldDesc=<m_pMTOfEnclosingClass->m_pEEClass->m_szDebugClassName,s>::<m_debugName,s>
146 Thread=<m_ThreadId,x>
148 BaseObject=<m_pMethTab->m_pEEClass->m_szDebugClassName,s>
149 Object=<m_pMethTab->m_pEEClass->m_szDebugClassName,s>
150 StringObject=<m_Characters>
151 OBJECTREF= <m_asObj->m_pMethTab->m_pEEClass->m_szDebugClassName,s>
152 REF<StringObject>=<m_asString->m_Characters>
153 REF<*>= <m_asObj->m_pMethTab->m_pEEClass->m_szDebugClassName,s>
155 ; SStrings are annoying because their internal buffer can be in either
156 ; unicode or ansi depending on the code path. Thus, this rule attempts
157 ; to print it both ways. We will do the ascii attempt first as it's
158 ; less likely to produce verbose garbage (usually, it'll print just the
161 ; So the typical output you'll see is...
163 ; {"A"/"ABCD"} ; sbuffer is using unicode representation
164 ; {"ABCD"/"<square boxes>"} ; sbuffer was using ansi representation
166 ; The rule below also kicks in as desired for StackSString and InlineSString.
168 SString =<m_buffer, s>|<m_buffer, su>
171 HolderBase<*>=<m_value>
173 NATIVE_BINDER_SPACE::IEntry=<_tag,su>
174 HolderBase<NATIVE_BINDER_SPACE::IEntry *>=<m_value> <m_value->_tag,su>
175 HolderBase<NATIVE_BINDER_SPACE::CILEntry *>=<m_value> <m_value->_tag,su>
176 HolderBase<NATIVE_BINDER_SPACE::CNgenEntry *>=<m_value> <m_value->_tag,su>
178 NATIVE_BINDER_SPACE::CILEntryBind=<_pILEntry->_tag,su>
179 HolderBase<NATIVE_BINDER_SPACE::CILEntryBind *>=<m_value> <m_value->_pILEntry->_tag,su>
181 NATIVE_BINDER_SPACE::CNgenEntryBind=<_pNgenEntry->_tag,su>
182 HolderBase<NATIVE_BINDER_SPACE::CNgenEntryBind *>=<m_value> <m_value->_pNgenEntry->_tag,su>
184 NATIVE_BINDER_SPACE::CDependencyEntry=<_pEntry->_tag,su>
185 HolderBase<NATIVE_BINDER_SPACE::CDependencyEntry *>=<m_value> <m_value->_pEntry->_tag,su>
187 CAssemblyName=<_rProp._rProp[3].asStr>
188 HolderBase<CAssemblyName *>=<m_value->_rProp._rProp[3].asStr>
189 HolderBase<IAssemblyName *>=<m_pAutoExpVisibleValue->_asCAssemblyName->_rProp._rProp[3].asStr>
191 BindResult=<m_tag,su>
192 HolderBase<BindResult *>=<m_value->m_tag,su>
193 HolderBase<IBindResult *>=<m_pAutoExpVisibleValue->_asBindResult->m_tag,su>
195 AssemblyLocation=<m_pwzAssemblyPath>
196 HolderBase<AssemblyLocation *>=<m_value->m_pwzAssemblyPath>
197 HolderBase<IAssemblyLocation *>=<m_pAutoExpVisibleValue->_asAssemblyLocation->m_pwzAssemblyPath>
200 ;---- [END] CLR-specific autoexps ---------------------------
208 tagPOINT =x=<x> y=<y>
209 tagRECT =top=<top> bottom=<bottom> left=<left> right=<right>
212 tagMSG =msg=<message,x> wp=<wParam,x> lp=<lParam,x>
216 __m128=$BUILTIN(M128)
217 __m128i=$BUILTIN(M128I)
218 __m128d=$BUILTIN(M128D)
221 CDC =hDC=<m_hDC> attrib=<m_hAttribDC>
222 CPaintDC =<,t> hWnd=<m_hWnd>
224 CRect =top=<top> bottom=<bottom> left=<left> right=<right>
225 CSize =cx=<cx> cy=<cy>
226 CWnd =<,t> hWnd=<m_hWnd>
227 CWinApp =<,t> <m_pszAppName,s>
228 CWinThread =<,t> h=<m_hThread> proc=<m_pfnThreadProc>
231 CPtrList =cnt=<m_nCount>
234 CProcessLocalObject =<,t>
235 CThreadLocalObject =<,t>
238 CArchiveException =cause=<m_cause>
239 CFile =hFile=<m_hFile> name=<m_strFileName.m_pchData,s>
240 CFileException =cause=<m_cause> OS Error=m_lOsError
241 CMemFile =pos=<m_nPosition> size=<m_nFileSize>
243 CRuntimeClass =<m_lpszClassName,s>
244 CStdioFile =FILE*=<m_pStream> name=<m_strFilename.m_pchData,s>
245 CTimeSpan =time=<m_time>
249 CByteArray =count=<m_nCount>
250 CStringList =count=<m_nCount>
251 ; same for all CXXXArray classes
253 ; same for CMapXXToXX
255 ; various string classes from MFC & ATL
257 _com_error=<m_hresult,hr>
258 _bstr_t=<m_Data->m_wstr,su> (<m_Data->m_RefCount,u>)
259 _com_ptr_t<*>=<m_pInterface>
260 _LARGE_INTEGER=<QuadPart>
261 _ULARGE_INTEGER=<QuadPart>
264 ATL::CComQIPtr<*>=<p>
266 tagVARIANT=$BUILTIN(VARIANT)
267 VARIANT=$BUILTIN(VARIANT)
270 ; see EEAddIn sample for how to use these
271 ;_SYSTEMTIME=$ADDIN(EEAddIn.dll,AddIn_SystemTime)
272 ;_FILETIME=$ADDIN(EEAddIn.dll,AddIn_FileTime)
274 std::binder1st<*>= op=<op> value=<value>
275 std::binder2nd<*>= op=<op> value=<value>
276 std::less<*>=lessthan
277 std::greater<*>=greaterthan
280 ; This section contains visualizers for STL and ATL containers
285 ATL::CStringT<char,*>|CSimpleStringT<char,*>|ATL::CSimpleStringT<char,*>{
286 preview([$c.m_pszData,s])
287 stringview([$c.m_pszData,sb])
290 ATL::CStringT<wchar_t,*>|CSimpleStringT<wchar_t,*>|ATL::CSimpleStringT<wchar_t,*>|ATL::CStringT<unsigned short,*>|CSimpleStringT<unsigned short,*>|ATL::CSimpleStringT<unsigned short,*>{
291 preview([$c.m_pszData,su])
292 stringview([$c.m_pszData,sub])
296 preview([$c.m_str,su])
297 stringview([$c.m_str,sub])
301 ;------------------------------------------------------------------------------
302 ; std::vector<bool,*> specialization
303 ;------------------------------------------------------------------------------
310 expr : ($c._Myvec._Myfirst[$i / _VBITS] >> ($i % _VBITS)),
323 expr : ($c._Myvec._Myfirst[$i / _VBITS] >> ($i % _VBITS)),
325 ) : (bool)($e & 1), ")")
329 std::vector<bool,*>::iterator|std::vector<bool,*>::const_iterator|std::_Vb_iterator<*>|std::_Vb_const_iterator<*>{
333 (bool) (((*$e._Myptr) >> $e._Myoff) & 1)
340 ptr: (bool) (((*$e._Myptr) >> $e._Myoff) & 1)
348 ;------------------------------------------------------------------------------
350 ;------------------------------------------------------------------------------
356 expr : ($c._Myfirst)[$i],
357 size : $c._Mylast-$c._Myfirst
365 $e._Mylast - $e._Myfirst ,
370 expr : ($c._Myfirst)[$i],
371 size : $c._Mylast-$c._Myfirst
380 std::_Vector_iterator<*>|std::_Vector_const_iterator<*>{
394 ;------------------------------------------------------------------------------
395 ; std::string/basic_string
396 ;------------------------------------------------------------------------------
398 std::basic_string<char,*>{
401 #if(($e._Myres) < ($e._BUF_SIZE))
413 #if(($e._Myres) < ($e._BUF_SIZE))
425 #if(($e._Myres) < ($e._BUF_SIZE))
427 #([actual members]: [$e,!] , #array( expr: $e._Bx._Buf[$i], size: $e._Mysize))
431 #([actual members]: [$e,!], #array( expr: $e._Bx._Ptr[$i], size: $e._Mysize))
437 std::basic_string<unsigned short,*>|std::basic_string<wchar_t,*>{
440 #if(($e._Myres) < ($e._BUF_SIZE)) ( [$e._Bx._Buf,su] )
441 #else ( [$e._Bx._Ptr,su] )
446 #if(($e._Myres) < ($e._BUF_SIZE)) ( [$e._Bx._Buf,sub] )
447 #else ( [$e._Bx._Ptr,sub] )
452 #if(($e._Myres) < ($e._BUF_SIZE))
454 #([actual members]: [$e,!] , #array( expr: $e._Bx._Buf[$i], size: $e._Mysize))
458 #([actual members]: [$e,!], #array( expr: $e._Bx._Ptr[$i], size: $e._Mysize))
463 std::basic_string<*>::iterator|std::basic_string<*>::const_iterator|std::_String_iterator<*>|std::_String_const_iterator<*>{
488 ;------------------------------------------------------------------------------
490 ;------------------------------------------------------------------------------
496 (*(($T1 *)$c._Myptr))
502 ptr: (*(($T1 *)$c._Myptr))
507 ;------------------------------------------------------------------------------
509 ;------------------------------------------------------------------------------
516 head : $c._Myhead->_Parent,
533 head : $c._Myhead->_Parent,
545 ;------------------------------------------------------------------------------
547 ;------------------------------------------------------------------------------
554 head : $c._Myhead->_Parent,
571 head : $c._Myhead->_Parent,
584 ;------------------------------------------------------------------------------
586 ;------------------------------------------------------------------------------
594 head : $c._Myhead->_Next,
609 head : $c._Myhead->_Next,
619 std::list<*>::iterator|std::list<*>::const_iterator|std::list<*>::_Iterator<1>|std::list<*>::_Const_iterator<1>{
627 #(ptr: $e._Ptr->_Myval)
633 ;------------------------------------------------------------------------------
634 ; std::bitset <bitset>
635 ;------------------------------------------------------------------------------
646 expr : ($c._Array[$i / $c._Bitsperword] >> ($i % $c._Bitsperword)),
656 expr : ($c._Array[$i / $c._Bitsperword] >> ($i % $c._Bitsperword)),
661 std::bitset<*>::reference{
665 "bitset[", $e._Mypos, "] = ",
666 (bool)(($e._Pbitset->_Array[$i / _Bitsperword] >> ($e._Mypos % _Bitsperword)) & 1)
671 ;------------------------------------------------------------------------------
673 ;------------------------------------------------------------------------------
680 expr : $c._Map[ (($i + $c._Myoff) / $c._EEN_DS) % $c._Mapsize][($i + $c._Myoff) % $c._EEN_DS],
694 expr : $c._Map[ (($i + $c._Myoff) / $c._EEN_DS) % $c._Mapsize][($i + $c._Myoff) % $c._EEN_DS],
703 std::deque<*,*>::iterator|std::_Deque_iterator<*,*,*>|std::_Deque_const_iterator<*,*,*>{
706 #if( $e._Myoff >= ((std::deque<$T1,$T2 > *)$c._Mycont)->_Myoff + ((std::deque<$T1,$T2 > *)$c._Mycont)->_Mysize)
713 $e._Myoff - ((std::deque<$T1,$T2 > *)$c._Mycont)->_Myoff,
715 ((std::deque<$T1,$T2 > *)$c._Mycont)->_Map[ (($c._Myoff) / ((std::deque<$T1,$T2 > *)$c._Mycont)->_EEN_DS) % ((std::deque<$T1,$T2 > *)$c._Mycont)->_Mapsize][$c._Myoff % ((std::deque<$T1,$T2 > *)$c._Mycont)->_EEN_DS]
721 #if( ((std::deque<$T1,$T2 > *)$c._Mycont)->_Myoff + ((std::deque<$T1,$T2 > *)$c._Mycont)->_Mysize > $e._Myoff)
724 ptr: ((std::deque<$T1,$T2 > *)$c._Mycont)->_Map[ ($c._Myoff / ((std::deque<$T1,$T2 > *)$c._Mycont)->_EEN_DS) % ((std::deque<$T1,$T2 > *)$c._Mycont)->_Mapsize][$c._Myoff % ((std::deque<$T1,$T2 > *)$c._Mycont)->_EEN_DS]
730 ;------------------------------------------------------------------------------
732 ;------------------------------------------------------------------------------
739 expr : $c.c._Map[ (($i + $c.c._Myoff) / $c.c._EEN_DS) % $c.c._Mapsize][($i + $c.c._Myoff) % $c.c._EEN_DS],
753 expr : $c.c._Map[ (($i + $c.c._Myoff) / $c.c._EEN_DS) % $c.c._Mapsize][($i + $c.c._Myoff) % $c.c._EEN_DS],
763 ;------------------------------------------------------------------------------
764 ; std::priority_queue
765 ;------------------------------------------------------------------------------
767 std::priority_queue<*>{
774 ;------------------------------------------------------------------------------
776 ;------------------------------------------------------------------------------
788 head : $c._Myhead->_Parent,
803 head : $c._Myhead->_Parent,
812 ;------------------------------------------------------------------------------
814 ;------------------------------------------------------------------------------
826 head : $c._Myhead->_Parent,
841 head : $c._Myhead->_Parent,
851 ;------------------------------------------------------------------------------
852 ; std::_Tree (shared my map/multimap/set/multiset)
853 ;------------------------------------------------------------------------------
855 std::_Tree<*>::iterator|std::_Tree<*>::const_iterator{
863 #(ptr: $e._Ptr->_Myval)
870 ;------------------------------------------------------------------------------
872 ;------------------------------------------------------------------------------
879 expr : $c.c._Map[ (($i + $c.c._Myoff) / $c.c._EEN_DS) % $c.c._Mapsize][($i + $c.c._Myoff) % $c.c._EEN_DS],
893 expr : $c.c._Map[ (($i + $c.c._Myoff) / $c.c._EEN_DS) % $c.c._Mapsize][($i + $c.c._Myoff) % $c.c._EEN_DS],
902 ;------------------------------------------------------------------------------
904 ; stdext::hash_multimap
906 ; stdext::hash_multiset
907 ;------------------------------------------------------------------------------
909 stdext::hash_map<*>|stdext::hash_multimap<*>|stdext::hash_set<*>|stdext::hash_multiset<*>{
920 head : $c._List._Myhead->_Next,
921 size : $c._List._Mysize,
934 head : $c._List._Myhead->_Next,
935 size : $c._List._Mysize,
941 ;------------------------------------------------------------------------------
943 ;------------------------------------------------------------------------------
950 imaginary: $e._Val[1]
957 #if ($e._Val[0] != 0)
958 ( ; Real and Imaginary components
959 #if ($e._Val[1] >= 0)
961 #($e._Val[0],"+i*", $e._Val[1])
965 #($e._Val[0],"-i*", -$e._Val[1])
970 #if ($e._Val[1] >= 0.0)
976 #("-i*", -$e._Val[1])
987 ;------------------------------------------------------------------------------
989 ;------------------------------------------------------------------------------
1001 expr : ($c._Myptr)[$i],
1013 expr : ($c._Myptr)[$i],
1019 ;------------------------------------------------------------------------------
1021 ;------------------------------------------------------------------------------
1023 ; Visualizers for VT_VECTOR C arrays
1024 tagCAC|tagCAUB|tagCAI|tagCAUI|tagCAL|tagCAUL|tagCAFLT|tagCADBL|tagCACY|tagCADATE|tagCABSTR|tagCABSTRBLOB|tagCABOOL|tagCASCODE|tagCAPROPVARIANT|tagCAH|tagCAUH|tagCALPSTR|tagCALPWSTR|tagCAFILETIME|tagCACLIPDATA|tagCACLSID{
1033 expr : ($c.pElems)[$i],
1044 expr : ($c.pElems)[$i],
1051 ; Visualizers for SAFE ARRAY
1052 tagSAFEARRAY|SAFEARRAY{
1054 #if ($c.fFeatures & 0x0080) ; FADF_HAVEVARTYPE
1057 ; Switch on the variant type field - which is stored 4 bytes
1058 ; before the beginning of the SAFEARRAY type
1060 #switch( ((unsigned *)&($c))[-1] )
1061 #case 0x2 ; VT_I2 | VT_ARRAY
1064 "safearray of I2 = [",
1066 ; output the rank array
1067 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1071 ; output the data elements
1073 expr: ((signed short *)$c.pvData)[$i],
1074 size: $c.rgsabound[$r].cElements,
1076 base: $c.rgsabound[$r].lLbound
1082 #case 0x3 ; VT_I4 | VT_ARRAY
1085 "safearray of I4 = [",
1087 ; output the rank array
1088 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1092 ; output the data elements
1094 expr: ((signed int *)$c.pvData)[$i],
1095 size: $c.rgsabound[$r].cElements,
1097 base: $c.rgsabound[$r].lLbound
1103 #case 0x4 ; VT_R4 | VT_ARRAY
1106 "safearray of R4 = [",
1108 ; output the rank array
1109 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1113 ; output the data elements
1115 expr: ((float *)$c.pvData)[$i],
1116 size: $c.rgsabound[$r].cElements,
1118 base: $c.rgsabound[$r].lLbound
1124 #case 0x5 ; VT_R8 | VT_ARRAY
1127 "safearray of R8 = [",
1129 ; output the rank array
1130 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1134 ; output the data elements
1136 expr: ((double *)$c.pvData)[$i],
1137 size: $c.rgsabound[$r].cElements,
1139 base: $c.rgsabound[$r].lLbound
1145 #case 0x6 ; VT_CY | VT_ARRAY
1148 "safearray of CY = [",
1150 ; output the rank array
1151 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1155 ; output the data elements
1157 expr: ((CY *)$c.pvData)[$i],
1158 size: $c.rgsabound[$r].cElements,
1160 base: $c.rgsabound[$r].lLbound
1166 #case 0x7 ; VT_DATE | VT_ARRAY
1169 "safearray of DATE = [",
1171 ; output the rank array
1172 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1176 ; output the data elements
1178 expr: ((DATE *)$c.pvData)[$i],
1179 size: $c.rgsabound[$r].cElements,
1181 base: $c.rgsabound[$r].lLbound
1187 #case 0x8 ; VT_BSTR | VT_ARRAY
1190 "safearray of BSTR = [",
1192 ; output the rank array
1193 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1197 ; output the data elements
1199 expr: ((wchar_t **)$c.pvData)[$i],
1200 size: $c.rgsabound[$r].cElements,
1202 base: $c.rgsabound[$r].lLbound
1208 #case 0xa ; VT_ERROR | VT_ARRAY
1211 "safearray of ERROR = [",
1213 ; output the rank array
1214 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1218 ; output the data elements
1220 expr: ((long *)$c.pvData)[$i],
1221 size: $c.rgsabound[$r].cElements,
1223 base: $c.rgsabound[$r].lLbound
1229 #case 0xb ; VT_BOOL | VT_ARRAY
1232 "safearray of BOOL = [",
1234 ; output the rank array
1235 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1239 ; output the data elements
1241 expr: ((short *)$c.pvData)[$i],
1242 size: $c.rgsabound[$r].cElements,
1244 base: $c.rgsabound[$r].lLbound
1250 #case 0xc ; VT_VARIANT | VT_ARRAY
1253 "safearray of VARIANT = [",
1255 ; output the rank array
1256 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1260 ; output the data elements
1262 expr: ((tagVARIANT *)$c.pvData)[$i],
1263 size: $c.rgsabound[$r].cElements,
1265 base: $c.rgsabound[$r].lLbound
1271 #case 0x10 ; VT_I1 | VT_ARRAY
1274 "safearray of I1 = [",
1276 ; output the rank array
1277 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1281 ; output the data elements
1283 expr: ((signed char *)$c.pvData)[$i],
1284 size: $c.rgsabound[$r].cElements,
1286 base: $c.rgsabound[$r].lLbound
1292 #case 0x11 ; VT_UI1 | VT_ARRAY
1295 "safearray of UI1 = [",
1297 ; output the rank array
1298 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1302 ; output the data elements
1304 expr: ((unsigned char *)$c.pvData)[$i],
1305 size: $c.rgsabound[$r].cElements,
1307 base: $c.rgsabound[$r].lLbound
1313 #case 0x12 ; VT_UI2 | VT_ARRAY
1316 "safearray of UI2 = [",
1318 ; output the rank array
1319 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1323 ; output the data elements
1325 expr: ((unsigned short *)$c.pvData)[$i],
1326 size: $c.rgsabound[$r].cElements,
1328 base: $c.rgsabound[$r].lLbound
1334 #case 0x13 ; VT_UI4 | VT_ARRAY
1337 "safearray of UI4 = [",
1339 ; output the rank array
1340 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1344 ; output the data elements
1346 expr: ((unsigned int *)$c.pvData)[$i],
1347 size: $c.rgsabound[$r].cElements,
1349 base: $c.rgsabound[$r].lLbound
1355 #case 0x14 ; VT_I8 | VT_ARRAY
1358 "safearray of I8 = [",
1360 ; output the rank array
1361 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1365 ; output the data elements
1367 expr: ((signed __int64 *)$c.pvData)[$i],
1368 size: $c.rgsabound[$r].cElements,
1370 base: $c.rgsabound[$r].lLbound
1376 #case 0x15 ; VT_UI8 | VT_ARRAY
1379 "safearray of UI8 = [",
1381 ; output the rank array
1382 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1386 ; output the data elements
1388 expr: ((unsigned __int64 *)$c.pvData)[$i],
1389 size: $c.rgsabound[$r].cElements,
1391 base: $c.rgsabound[$r].lLbound
1397 #case 0x16 ; VT_INT | VT_ARRAY
1400 "safearray of INT = [",
1402 ; output the rank array
1403 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1407 ; output the data elements
1409 expr: ((int *)$c.pvData)[$i],
1410 size: $c.rgsabound[$r].cElements,
1412 base: $c.rgsabound[$r].lLbound
1418 #case 0x17 ; VT_UINT | VT_ARRAY
1421 "safearray of UINT = [",
1423 ; output the rank array
1424 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1428 ; output the data elements
1430 expr: ((unsigned *)$c.pvData)[$i],
1431 size: $c.rgsabound[$r].cElements,
1433 base: $c.rgsabound[$r].lLbound
1439 #case 0x1e ; VT_LPSTR | VT_ARRAY
1442 "safearray of LPSTR = [",
1444 ; output the rank array
1445 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1449 ; output the data elements
1451 expr: ((char **)$c.pvData)[$i],
1452 size: $c.rgsabound[$r].cElements,
1454 base: $c.rgsabound[$r].lLbound
1460 #case 0x1f ; VT_LPWSTR | VT_ARRAY
1463 "safearray of LPWSTR = [",
1465 ; output the rank array
1466 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1470 ; output the data elements
1472 expr: ((wchar_t **)$c.pvData)[$i],
1473 size: $c.rgsabound[$r].cElements,
1475 base: $c.rgsabound[$r].lLbound
1481 #case 0x40 ; VT_FILETIME | VT_ARRAY
1484 "safearray of FILETIME = [",
1486 ; output the rank array
1487 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1491 ; output the data elements
1493 expr: ((FILETIME *)$c.pvData)[$i],
1494 size: $c.rgsabound[$r].cElements,
1496 base: $c.rgsabound[$r].lLbound
1502 #case 0x47 ; VT_CLIPDATA | VT_ARRAY
1505 "safearray of CLIPDATA = [",
1507 ; output the rank array
1508 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1512 ; output the data elements
1514 expr: ((CLIPDATA *)$c.pvData)[$i],
1515 size: $c.rgsabound[$r].cElements,
1517 base: $c.rgsabound[$r].lLbound
1523 #case 0x48 ; VT_CLSID | VT_ARRAY
1526 "safearray of CLSID = [",
1528 ; output the rank array
1529 #array( expr: $c.rgsabound[$i].cElements, size: $c.cDims),
1533 ; output the data elements
1535 expr: ((CLSID *)$c.pvData)[$i],
1536 size: $c.rgsabound[$r].cElements,
1538 base: $c.rgsabound[$r].lLbound
1544 #elif ($c.fFeatures & 0x0100) ; FADF_BSTR
1546 #("safearray of BSTR = ",#array(expr: $c.rgsabound[$i].cElements, size: $c.cDims) : #("[",$e,"]"), "(", #array(expr: ((wchar_t * *)$c.pvData)[$i], size: $c.rgsabound[$r].cElements, rank: $c.cDims, base: $c.rgsabound[$r].lLbound ), ")")
1548 #elif ($c.fFeatures & 0x0200) ; FADF_UNKNOWN
1550 #("safearray of IUnknown* = ",#array(expr: $c.rgsabound[$i].cElements, size: $c.cDims) : #("[",$e,"]"), "(", #array(expr: ((IUnknown *)$c.pvData)[$i], size: $c.rgsabound[$r].cElements, rank: $c.cDims, base: $c.rgsabound[$r].lLbound ), ")")
1552 #elif ($c.fFeatures & 0x0400) ; FADF_DISPATCH
1554 #("safearray of IDispatch* = ",#array(expr: $c.rgsabound[$i].cElements, size: $c.cDims) : #("[",$e,"]"), "(", #array(expr: ((IDispatch*)$c.pvData)[$i], size: $c.rgsabound[$r].cElements, rank: $c.cDims, base: $c.rgsabound[$r].lLbound ), ")")
1556 #elif ($c.fFeatures & 0x0800) ; FADF_VARIANT
1558 #("safearray of VARIANT = ",#array(expr: $c.rgsabound[$i].cElements, size: $c.cDims) : #("[",$e,"]"), "(", #array(expr: ((tagVARIANT *)$c.pvData)[$i], size: $c.rgsabound[$r].cElements, rank: $c.cDims, base: $c.rgsabound[$r].lLbound ), ")")
1562 #( ;[actual members]: [$c,!],
1563 #if ($c.fFeatures & 0x0080) ; FADF_HAVEVARTYPE
1565 #switch( ((unsigned *)&($c))[-1] ) ; for some reason the VT field is before the SAFEARRAY struct
1566 #case 2 ; VT_I2|VT_ARRAY
1569 expr: ((signed short *)$c.pvData)[$i],
1570 size: $c.rgsabound[$r].cElements,
1572 base: $c.rgsabound[$r].lLbound
1576 #case 3 ; VT_I4|VT_ARRAY
1579 expr: ((signed int *)$c.pvData)[$i],
1580 size: $c.rgsabound[$r].cElements,
1582 base: $c.rgsabound[$r].lLbound
1586 #case 4 ; VT_R4|VT_ARRAY
1589 expr: ((float *)$c.pvData)[$i],
1590 size: $c.rgsabound[$r].cElements,
1592 base: $c.rgsabound[$r].lLbound
1596 #case 5 ; VT_R8|VT_ARRAY
1599 expr: ((double *)$c.pvData)[$i],
1600 size: $c.rgsabound[$r].cElements,
1602 base: $c.rgsabound[$r].lLbound
1606 #case 0x10 ; VT_I1|VT_ARRAY
1609 expr: ((signed char *)$c.pvData)[$i],
1610 size: $c.rgsabound[$r].cElements,
1612 base: $c.rgsabound[$r].lLbound
1616 #case 0x11 ; VT_UI1|VT_ARRAY
1619 expr: ((unsigned char *)$c.pvData)[$i],
1620 size: $c.rgsabound[$r].cElements,
1622 base: $c.rgsabound[$r].lLbound
1626 #case 0x12 ; VT_UI2|VT_ARRAY
1629 expr: ((unsigned short *)$c.pvData)[$i],
1630 size: $c.rgsabound[$r].cElements,
1632 base: $c.rgsabound[$r].lLbound
1636 #case 0x13 ; VT_UI4|VT_ARRAY
1639 expr: ((unsigned int *)$c.pvData)[$i],
1640 size: $c.rgsabound[$r].cElements,
1642 base: $c.rgsabound[$r].lLbound
1646 #case 0x14 ; VT_I8|VT_ARRAY
1649 expr: ((signed __int64 *)$c.pvData)[$i],
1650 size: $c.rgsabound[$r].cElements,
1652 base: $c.rgsabound[$r].lLbound
1655 #case 0x15 ; VT_UI8|VT_ARRAY
1658 expr: ((unsigned __int64 *)$c.pvData)[$i],
1659 size: $c.rgsabound[$r].cElements,
1661 base: $c.rgsabound[$r].lLbound
1665 #case 0x1e ; VT_LPSTR|VT_ARRAY
1668 expr: ((char * *)$c.pvData)[$i],
1669 size: $c.rgsabound[$r].cElements,
1671 base: $c.rgsabound[$r].lLbound
1675 #case 0x1f ; VT_LPWSTR|VT_ARRAY
1678 expr: ((wchar_t **)$c.pvData)[$i],
1679 size: $c.rgsabound[$r].cElements,
1681 base: $c.rgsabound[$r].lLbound
1685 #case 0xc ; VT_VARIANT|VT_ARRAY
1688 expr: ((tagVARIANT *)$c.pvData)[$i],
1689 size: $c.rgsabound[$r].cElements,
1691 base: $c.rgsabound[$r].lLbound
1696 #case 0xb ; VT_BOOL|VT_ARRAY
1699 expr: ((short *)$c.pvData)[$i],
1700 size: $c.rgsabound[$r].cElements,
1702 base: $c.rgsabound[$r].lLbound
1706 #case 0xa ; VT_ERROR|VT_ARRAY
1709 expr: ((long *)$c.pvData)[$i],
1710 size: $c.rgsabound[$r].cElements,
1712 base: $c.rgsabound[$r].lLbound
1716 #case 6 ; VT_CY|VT_ARRAY
1719 expr: ((CY *)$c.pvData)[$i],
1720 size: $c.rgsabound[$r].cElements,
1722 base: $c.rgsabound[$r].lLbound
1726 #case 7 ; VT_DATE|VT_ARRAY
1729 expr: ((DATE *)$c.pvData)[$i],
1730 size: $c.rgsabound[$r].cElements,
1732 base: $c.rgsabound[$r].lLbound
1736 #case 0x40 ; VT_FILETIME|VT_ARRAY
1739 expr: ((FILETIME *)$c.pvData)[$i],
1740 size: $c.rgsabound[$r].cElements,
1742 base: $c.rgsabound[$r].lLbound
1746 #case 0x48 ; VT_CLSID|VT_ARRAY
1749 expr: ((CLSID *)$c.pvData)[$i],
1750 size: $c.rgsabound[$r].cElements,
1752 base: $c.rgsabound[$r].lLbound
1756 #case 0x47 ; VT_CF|VT_ARRAY
1759 expr: ((CLIPDATA *)$c.pvData)[$i],
1760 size: $c.rgsabound[$r].cElements,
1762 base: $c.rgsabound[$r].lLbound
1766 #case 8 ; VT_BSTR|VT_ARRAY
1769 expr: ((wchar_t * *)$c.pvData)[$i],
1770 size: $c.rgsabound[$r].cElements,
1772 base: $c.rgsabound[$r].lLbound
1776 #case 0x16 ; VT_INT|VT_ARRAY
1779 expr: ((int *)$c.pvData)[$i],
1780 size: $c.rgsabound[$r].cElements,
1782 base: $c.rgsabound[$r].lLbound
1786 #case 0x17 ; VT_UINT|VT_ARRAY
1789 expr: ((unsigned int*)$c.pvData)[$i],
1790 size: $c.rgsabound[$r].cElements,
1792 base: $c.rgsabound[$r].lLbound
1798 #([actual members]: [$e,!])
1802 #([actual members]: [$e,!])
1805 #elif ($c.fFeatures & 0x0100) ; FADF_BSTR
1807 #array(expr: ((wchar_t * *)$c.pvData)[$i], size: $c.rgsabound[$r].cElements, rank: $c.cDims, base: $c.rgsabound[$r].lLbound )
1809 #elif ($c.fFeatures & 0x0200) ; FADF_UNKNOWN
1811 #array(expr: ((IUnknown *)$c.pvData)[$i], size: $c.rgsabound[$r].cElements, rank: $c.cDims, base: $c.rgsabound[$r].lLbound )
1813 #elif ($c.fFeatures & 0x0400) ; FADF_DISPATCH
1815 #array(expr: ((IDispatch *)$c.pvData)[$i], size: $c.rgsabound[$r].cElements, rank: $c.cDims, base: $c.rgsabound[$r].lLbound )
1817 #elif ($c.fFeatures & 0x0800) ; FADF_VARIANT
1819 #array(expr: ((tagVARIANT *)$c.pvData)[$i], size: $c.rgsabound[$r].cElements, rank: $c.cDims, base: $c.rgsabound[$r].lLbound )
1825 tagPROPVARIANT|tagVARIANT|PROPVARIANT|VARIANT{
1828 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1830 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1831 #case 0 ( #("Empty") ) ; VT_EMPTY
1832 #case 1 ( #("NULL") ) ; VT_NULL
1833 #case 2 ( #("I2 = ", $e.iVal) ) ; VT_I2
1834 #case 3 ( #("I4 = ", $e.lVal) ) ; VT_I4
1835 #case 4 ( #("R4 = ", $e.fltVal) ) ; VT_R4
1836 #case 5 ( #("R8 = ", $e.dblVal) ) ; VT_R8
1837 #case 6 ( #("CY = ", $e.cyVal) ) ; VT_CY
1838 #case 7 ( #("DATE = ", $e.date) ) ; VT_DATE
1839 #case 8 ( #("BSTR = ", $e.bstrVal) ) ; VT_BSTR
1840 #case 9 ( #("DISPATCH = ", $e.pdispVal) ) ; VT_DISPATCH
1841 #case 10 ( #("ERROR = ", $e.scode) ) ; VT_ERROR
1842 #case 0xB ( #("BOOL = ", $e.boolVal) ) ; VT_BOOL
1843 #case 0xC ( #("VARIANT ") ) ; VT_VARIANT
1844 #case 0xD ( #("UNKNOWN = ", $e.punkVal) ) ; VT_UNKNOWN
1845 #case 0xE ( #("DECIMAL = ", $e.hVal) ) ; VT_DECIMAL
1846 #case 0x10 ( #("I1 = ", $e.cVal) ) ; VT_I1
1847 #case 0x11 ( #("UI1 = ", $e.bVal) ) ; VT_UI1
1848 #case 0x12 ( #("UI2 = ", $e.uiVal) ) ; VT_UI2
1849 #case 0x13 ( #("UI4 = ", $e.ulVal) ) ; VT_UI4
1850 #case 0x14 ( #("I8 = ", $e.hVal) ) ; VT_I8
1851 #case 0x15 ( #("UI8 = ", $e.uhVal) ) ; VT_UI8
1852 #case 0x16 ( #("INT = ", $e.intVal) ) ; VT_INT
1853 #case 0x17 ( #("UINT = ", $e.uintVal) ) ; VT_UINT
1854 #case 0x18 ( #("VOID ") ) ; VT_VOID
1855 #case 0x19 ( #("HRESULT ") ) ; VT_HRESULT
1856 #case 0x1A ( #("PTR ") ) ; VT_PTR
1857 #case 0x1B ( #("SAFEARRAY ") ) ; VT_SAFEARRAY
1858 #case 0x1C ( #("CARRAY ") ) ; VT_CARRAY
1859 #case 0x1D ( #("USERDEFINED ") ) ; VT_USERDEFINED
1860 #case 0x1E ( #("LPSTR = ", $e.pszVal) ) ; VT_LPSTR
1861 #case 0x1F ( #("LPWSTR = ", $e.pwszVal) ) ; VT_LPWSTR
1862 #case 0x24 ( #("RECORD ") ) ; VT_RECORD
1863 #case 0x26 ( #("UINT_PTR ") ) ; VT_UINT_PTR
1864 #case 0x40 ( #("FILETIME = ", $e.filetime) ) ; VT_FILETIME
1865 #case 0x42 ( #("STREAM = ", $e.pStream) ) ; VT_STREAM
1866 #case 0x43 ( #("STORAGE = ", $e.pStorage) ) ; VT_STORAGE
1867 #case 0x44 ( #("STREAMED_OBJECT = ", $e.pStream) ) ; VT_STREAMED_OBJECT
1868 #case 0x45 ( #("STORED_OBJECT = ", $e.pStorage) ) ; VT_STORED_OBJECT
1869 #case 0x46 ( #("BLOB_OBJECT = ", $e.blob ) ) ; VT_BLOB_OBJECT
1870 #case 0x47 ( #("CF = ", $e.pclipdata) ) ; VT_CF
1871 #case 0x48 ( #("CLSID = ", $e.puuid) ) ; VT_CLSID
1872 #case 0x49 ( #("VERSIONED_STREAM = ", $e.pVersionedStream) ) ; VT_VERSIONED_STREAM
1874 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1876 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1877 #case 0x1002 ( #("vector of I2 = ", $e.cai) ) ; VT_I2|VT_VECTOR
1878 #case 0x1003 ( #("vector of I4 = ", $e.cal) ) ; VT_I4|VT_VECTOR
1879 #case 0x1004 ( #("vector of R4 = ", $e.caflt) ) ; VT_R4|VT_VECTOR
1880 #case 0x1005 ( #("vector of R8 = ", $e.cadbl) ) ; VT_R8|VT_VECTOR
1881 #case 0x1010 ( #("vector of I1 = ", $e.cac) ) ; VT_I1|VT_VECTOR
1882 #case 0x1011 ( #("vector of UI1 = ", $e.caub) ) ; VT_UI1|VT_VECTOR
1883 #case 0x1012 ( #("vector of UI2 = ", $e.caui) ) ; VT_UI2|VT_VECTOR
1884 #case 0x1013 ( #("vector of UI4 = ", $e.caul) ) ; VT_UI4|VT_VECTOR
1885 #case 0x1014 ( #("vector of I8 = ", $e.cah) ) ; VT_I8|VT_VECTOR
1886 #case 0x1015 ( #("vector of UI8 = ", $e.cauh) ) ; VT_UI8|VT_VECTOR
1887 #case 0x101E ( #("vector of LPSTR = ", $e.calpstr) ) ; VT_LPSTR|VT_VECTOR
1888 #case 0x101F ( #("vector of LPWSTR = ", $e.calpwstr) ) ; VT_LPWSTR|VT_VECTOR
1889 #case 0x100C ( #("vector of VARIANT ", $e.capropvar) ) ; VT_VARIANT|VT_VECTOR
1890 #case 0x100B ( #("vector of BOOL = ", $e.cabool) ) ; VT_BOOL|VT_VECTOR
1891 #case 0x100A ( #("vector of ERROR = ", $e.cascode) ) ; VT_ERROR|VT_VECTOR
1892 #case 0x1006 ( #("vector of CY = ", $e.cacy) ) ; VT_CY|VT_VECTOR
1893 #case 0x1007 ( #("vector of DATE = ", $e.cadate) ) ; VT_DATE|VT_VECTOR
1894 #case 0x1040 ( #("vector of FILETIME = ", $e.cafiletime) ) ; VT_FILETIME|VT_VECTOR
1895 #case 0x1048 ( #("vector of CLSID = ", $e.cauuid) ) ; VT_CLSID|VT_VECTOR
1896 #case 0x1047 ( #("vector of CF = ", $e.caclipdata) ) ; VT_CF|VT_VECTOR
1897 #case 0x1008 ( #("vector of BSTR = ", $e.cabstr) ) ; VT_BSTR|VT_VECTOR
1899 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1901 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1902 #case 0x4016 ( #("byref of INT = ", $e.pintVal) ) ; VT_INT|VT_BYREF
1903 #case 0x4017 ( #("byref of UINT = ", $e.puintVal) ) ; VT_UINT|VT_BYREF
1904 #case 0x4002 ( #("byref of I2 = ", $e.piVal) ) ; VT_I2|VT_BYREF
1905 #case 0x4003 ( #("byref of I4 = ", $e.plVal) ) ; VT_I4|VT_BYREF
1906 #case 0x4004 ( #("byref of R4 = ", $e.pfltVal) ) ; VT_R4|VT_BYREF
1907 #case 0x4005 ( #("byref of R8 = ", $e.pdblVal) ) ; VT_R8|VT_BYREF
1908 #case 0x4010 ( #("byref of I1 = ", $e.pcVal) ) ; VT_I1|VT_BYREF
1909 #case 0x4011 ( #("byref of UI1 = ", $e.pbVal) ) ; VT_UI1|VT_BYREF
1910 #case 0x4012 ( #("byref of UI2 = ", $e.puiVal) ) ; VT_UI2|VT_BYREF
1911 #case 0x4013 ( #("byref of UI4 = ", $e.pulVal) ) ; VT_UI4|VT_BYREF
1912 #case 0x400C ( #("byref of VARIANT ", $e.pvarVal) ) ; VT_VARIANT|VT_BYREF
1913 #case 0x400B ( #("byref of BOOL = ", $e.pboolVal) ) ; VT_BOOL|VT_BYREF
1914 #case 0x400A ( #("byref of ERROR = ", $e.pscode) ) ; VT_ERROR|VT_BYREF
1915 #case 0x4006 ( #("byref of CY = ", $e.pcyVal) ) ; VT_CY|VT_BYREF
1916 #case 0x4007 ( #("byref of DATE = ", $e.pdate) ) ; VT_DATE|VT_BYREF
1917 #case 0x4008 ( #("byref of BSTR = ", $e.pbstrVal) ) ; VT_BSTR|VT_BYREF
1918 #case 0x400E ( #("byref of DECIMAL = ", $e.pdecVal) ) ; VT_DECIMAL|VT_BYREF
1919 #case 0x400D ( #("byref of UNKNOWN = ", $e.ppunkVal) ) ; VT_UNKNOWN|VT_BYREF
1920 #case 0x4009 ( #("byref of DISPATCH = ", $e.ppdispVal) ) ; VT_DISPATCH|VT_BYREF
1921 #case 0x6000 ( #("byref of ARRAY = ", $e.pparray) ) ; VT_ARRAY|VT_BYREF
1925 #if ($e.vt & 0x2000)
1931 #("Unknown vt type = ", $e.vt)
1940 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1942 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1943 #case 0x2 ( #(I2 : $e.iVal) ) ; VT_I2
1944 #case 0x3 ( #(I4 : $e.lVal) ) ; VT_I4
1945 #case 0x4 ( #(R4 : $e.fltVal) ) ; VT_R4
1946 #case 0x5 ( #(R8 : $e.dblVal) ) ; VT_R8
1947 #case 0x6 ( #(CY : $e.cyVal) ) ; VT_CY
1948 #case 0x7 ( #(DATE : $e.date) ) ; VT_DATE
1949 #case 0x8 ( #(BSTR : $e.bstrVal) ) ; VT_BSTR
1950 #case 0x9 ( #(DISPATCH : $e.pdispVal) ) ; VT_DISPATCH
1951 #case 0xA ( #(ERROR : $e.scode) ) ; VT_ERROR
1952 #case 0xB ( #(BOOL : $e.boolVal) ) ; VT_BOOL
1953 #case 0xD ( #(UNKNOWN : $e.punkVal) ) ; VT_UNKNOWN
1954 #case 0xE ( #(DECIMAL : $e.hVal) ) ; VT_DECIMAL
1955 #case 0x10 ( #(I1 : $e.cVal) ) ; VT_I1
1956 #case 0x11 ( #(UI1 : $e.bVal) ) ; VT_UI1
1957 #case 0x12 ( #(UI2 : $e.uiVal) ) ; VT_UI2
1958 #case 0x13 ( #(UI4 : $e.ulVal) ) ; VT_UI4
1959 #case 0x14 ( #(I8 : $e.hVal) ) ; VT_I8
1960 #case 0x15 ( #(UI8 : $e.uhVal) ) ; VT_UI8
1961 #case 0x16 ( #(INT : $e.intVal) ) ; VT_INT
1962 #case 0x17 ( #(UINT : $e.uintVal) ) ; VT_UINT
1963 #case 0x1E ( #(LPSTR : $e.pszVal) ) ; VT_LPSTR
1964 #case 0x1F ( #(LPWSTR : $e.pwszVal) ) ; VT_LPWSTR
1965 #case 0x40 ( #(FILETIME : $e.filetime) ) ; VT_FILETIME
1966 #case 0x42 ( #(STREAM : $e.pStream) ) ; VT_STREAM
1967 #case 0x43 ( #(STORAGE : $e.pStorage) ) ; VT_STORAGE
1968 #case 0x44 ( #(STREAMED_OBJECT : $e.pStream) ) ; VT_STREAMED_OBJECT
1969 #case 0x45 ( #(STORED_OBJECT : $e.pStorage) ) ; VT_STORED_OBJECT
1970 #case 0x46 ( #(BLOB_OBJECT : $e.blob ) ) ; VT_BLOB_OBJECT
1971 #case 0x47 ( #(CF : $e.pclipdata) ) ; VT_CF
1972 #case 0x48 ( #(CLSID : $e.puuid) ) ; VT_CLSID
1973 #case 0x49 ( #(VERSIONED_STREAM : $e.pVersionedStream) ) ; VT_VERSIONED_STREAM
1975 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1977 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1978 #case 0x1002 ( #(vector of I2 : $e.cai) ) ; VT_I2|VT_VECTOR
1979 #case 0x1003 ( #(vector of I4 : $e.cal) ) ; VT_I4|VT_VECTOR
1980 #case 0x1004 ( #(vector of R4 : $e.caflt) ) ; VT_R4|VT_VECTOR
1981 #case 0x1005 ( #(vector of R8 : $e.cadbl) ) ; VT_R8|VT_VECTOR
1982 #case 0x1010 ( #(vector of I1 : $e.cac) ) ; VT_I1|VT_VECTOR
1983 #case 0x1011 ( #(vector of UI1 : $e.caub) ) ; VT_UI1|VT_VECTOR
1984 #case 0x1012 ( #(vector of UI2 : $e.caui) ) ; VT_UI2|VT_VECTOR
1985 #case 0x1013 ( #(vector of UI4 : $e.caul) ) ; VT_UI4|VT_VECTOR
1986 #case 0x1014 ( #(vector of I8 : $e.cah) ) ; VT_I8|VT_VECTOR
1987 #case 0x1015 ( #(vector of UI8 : $e.cauh) ) ; VT_UI8|VT_VECTOR
1988 #case 0x101E ( #(vector of LPSTR : $e.calpstr) ) ; VT_LPSTR|VT_VECTOR
1989 #case 0x101F ( #(vector of LPWSTR : $e.calpwstr) ) ; VT_LPWSTR|VT_VECTOR
1990 #case 0x100C ( #(vector of VARIANT : $e.capropvar) ) ; VT_VARIANT|VT_VECTOR
1991 #case 0x100B ( #(vector of BOOL : $e.cabool) ) ; VT_BOOL|VT_VECTOR
1992 #case 0x100A ( #(vector of ERROR : $e.cascode) ) ; VT_ERROR|VT_VECTOR
1993 #case 0x1006 ( #(vector of CY : $e.cacy) ) ; VT_CY|VT_VECTOR
1994 #case 0x1007 ( #(vector of DATE : $e.cadate) ) ; VT_DATE|VT_VECTOR
1995 #case 0x1040 ( #(vector of FILETIME : $e.cafiletime) ) ; VT_FILETIME|VT_VECTOR
1996 #case 0x1048 ( #(vector of CLSID : $e.cauuid) ) ; VT_CLSID|VT_VECTOR
1997 #case 0x1047 ( #(vector of CF : $e.caclipdata) ) ; VT_CF|VT_VECTOR
1998 #case 0x1008 ( #(vector of BSTR : $e.cabstr) ) ; VT_BSTR|VT_VECTOR
2000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2002 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2003 #case 0x4016 ( #(byref of INT : $e.pintVal) ) ; VT_INT|VT_BYREF
2004 #case 0x4017 ( #(byref of UINT : $e.puintVal) ) ; VT_UINT|VT_BYREF
2005 #case 0x4002 ( #(byref of I2 : $e.piVal) ) ; VT_I2|VT_BYREF
2006 #case 0x4003 ( #(byref of I4 : $e.plVal) ) ; VT_I4|VT_BYREF
2007 #case 0x4004 ( #(byref of R4 : $e.pfltVal) ) ; VT_R4|VT_BYREF
2008 #case 0x4005 ( #(byref of R8 : $e.pdblVal) ) ; VT_R8|VT_BYREF
2009 #case 0x4010 ( #(byref of I1 : $e.pcVal) ) ; VT_I1|VT_BYREF
2010 #case 0x4011 ( #(byref of UI1 : $e.pbVal) ) ; VT_UI1|VT_BYREF
2011 #case 0x4012 ( #(byref of UI2 : $e.puiVal) ) ; VT_UI2|VT_BYREF
2012 #case 0x4013 ( #(byref of UI4 : $e.pulVal) ) ; VT_UI4|VT_BYREF
2013 #case 0x400C ( #(byref of VARIANT : $e.pvarVal) ) ; VT_VARIANT|VT_BYREF
2014 #case 0x400B ( #(byref of BOOL : $e.pboolVal) ) ; VT_BOOL|VT_BYREF
2015 #case 0x400A ( #(byref of ERROR : $e.pscode) ) ; VT_ERROR|VT_BYREF
2016 #case 0x4006 ( #(byref of CY : $e.pcyVal) ) ; VT_CY|VT_BYREF
2017 #case 0x4007 ( #(byref of DATE : $e.pdate) ) ; VT_DATE|VT_BYREF
2018 #case 0x4008 ( #(byref of BSTR : $e.pbstrVal) ) ; VT_BSTR|VT_BYREF
2019 #case 0x400E ( #(byref of DECIMAL : $e.pdecVal) ) ; VT_DECIMAL|VT_BYREF
2020 #case 0x400D ( #(byref of UNKNOWN : $e.ppunkVal) ) ; VT_UNKNOWN|VT_BYREF
2021 #case 0x4009 ( #(byref of DISPATCH : $e.ppdispVal) ) ; VT_DISPATCH|VT_BYREF
2022 #case 0x6000 ( #(byref of ARRAY : $e.pparray) ) ; VT_ARRAY|VT_BYREF
2024 ; the following are either empty or invalid vt values for a variant
2025 ; #case 0 ( #(Empty :) ) ; VT_EMPTY
2026 ; #case 0x1 ( #(NULL :) ) ; VT_NULL
2027 ; #case 0xC ( #(VARIANT :) ) ; VT_VARIANT
2028 ; #case 0x18 ( #(VOID :) ) ; VT_VOID
2029 ; #case 0x19 ( #(HRESULT :) ) ; VT_HRESULT
2030 ; #case 0x1A ( #(PTR :) ) ; VT_PTR
2031 ; #case 0x1B ( #(SAFEARRAY :) ) ; VT_SAFEARRAY
2032 ; #case 0x1C ( #(CARRAY :) ) ; VT_CARRAY
2033 ; #case 0x1D ( #(USERDEFINED :) ) ; VT_USERDEFINED
2034 ; #case 0x24 ( #(RECORD :) ) ; VT_RECORD
2035 ; #case 0x26 ( #(UINT_PTR :) ) ; VT_UINT_PTR
2039 #if ($e.vt & 0x2000 )
2041 #(safearray: $e.parray)
2046 [raw members]: [$e,!] ; unformatted data members
2053 [raw members]: [$e,!] ; unformatted data members
2059 ; This section lets you define your own errors for the HRESULT display.
2060 ; You need to list the error code in unsigned decimal, followed by the message.
2061 ; Changes will take effect the next time you redisplay the variable.
2063 ;1234=my custom error code