Hi Jose,
here translation of TypeDescStringify:
'typedesc string
Function TDStr(ptD As typedesc ptr,pTI As lptypeinfo)As String
Dim oss As String
Dim s2 As safearraybound Ptr
Dim u2 As UShort Ptr
If ptD->vt= VT_PTR Then
oss=TDStr(ptD->lptdesc, pTI) & " Ptr"
If oss=" As void Ptr" Then Return " As lpvoid" Else Return oss
EndIf
If ptd->vt= VT_SAFEARRAY Then
oss= " As Dword /'SAFEARRAY(" & tdstr(ptd->lptdesc, pTI) & ")'/"
Return oss
EndIf
If ptd->vt=vt_carray Then
For i As UShort=0 To ptd->lpadesc->cdims-1
oss &=ptd->lpadesc->rgbounds(i).llbound & " To "
oss &=ptd->lpadesc->rgbounds(i).llbound+ptd->lpadesc->rgbounds(i).celements-1 & ","
Next
oss=Trim(oss,",")
oss &=")"
oss &=tdstr(@ptd->lpadesc->tdescElem, pTI)
Return oss
EndIf
If ptd->vt= VT_USERDEFINED Then
oss=CTstr(ptd->hreftype, pTI)
Return oss
EndIf
Select Case ptd->vt
' VARIANT/VARIANTARG compatible types
Case VT_I2: Return " As short"
Case VT_I4: Return " As long"
Case VT_R4: Return " As float"
Case VT_R8: Return " As double"
Case VT_CY: Return " As CY"
Case VT_DATE: Return " As DATE_"
Case VT_BSTR: Return " As BSTR"
Case VT_DISPATCH: Return " As lpDispatch"
Case VT_ERROR: Return " As SCODE"
Case VT_BOOL: Return " As long"
Case VT_VARIANT: Return " As VARIANT"
Case VT_UNKNOWN: Return " As lpUnknown"
Case VT_UI1: Return " As UBYTE"
Case VT_DECIMAL: Return " As DECIMAL"
Case VT_I1: Return " As BYTE"
Case VT_UI2: Return " As USHORT"
Case VT_UI4: Return " As ULONG"
Case VT_I8: Return " As longint"
Case VT_UI8: Return " As ulongint"
Case VT_INT: Return " As integer"
Case VT_UINT: Return " As UINT"
Case VT_HRESULT: Return " As HRESULT"
Case VT_VOID: Return " As void"
Case VT_LPSTR: Return " As lpstr"
Case VT_LPWSTR: Return " As lpwstr"
End Select
End Function
but, I have starnge output in VT_CARRAY part,
where
ptd->lpadesc->cdims give me a big number.
ptd->lpadesc->rgbounds(i).llbound give me ptd->lpadesc->rgbounds(i).cElements
and as "solver" I should add cDims pointer with 2
and add rgbounds pointer with 4
and everything result as expected.
I suspect this about endian-ess issue, am I right?
Quote
I suspect this about endian-ess issue, am I right?
No. What happens is that the TYPEDESC and ARRAYDESC structures must be DWORD aligned.
In PowerBASIC, I have them declared as:
UNION TYPEDESCDATA
lptdesc AS DWORD ' VT_PTR - the pointed-at type
lpadesc AS DWORD ' VT_CARRAY
hreftype AS DWORD ' VT_USERDEFINED - this is used to get a TypeInfo for the UDT
END UNION
TYPE TYPEDESC DWORD ' // Must be DWORD aligned
TYPEDESCDATA
vt AS WORD ' VARTYPE
END TYPE
TYPE ARRAYDESC DWORD ' // Must be DWORD aligned
tdescElem AS TYPEDESC ' Element type
cDims AS WORD ' Dimension count
rgbounds(0) AS SAFEARRAYBOUND ' Variable length array containing one element for each dimension.
END TYPE
Don't know what you use in FreeBasic, although, as a workaround, you could add a filler WORD member after vt and cDims.
try to allign 4 bytes... (dword) inside oaidl.bi (fb version of oaidl.h)
type TYPEDESC field=4
Union
lptdesc As TYPEDESC Ptr
lpadesc as ARRAYDESC_ ptr
hreftype as HREFTYPE
End Union
vt as VARTYPE
end type
type ARRAYDESC field=4
tdescElem as TYPEDESC
cDims as USHORT
rgbounds(0 to 1-1) as SAFEARRAYBOUND
end type
but it still give strange result,
but 2nd option, add filler word work as expected ^_^
thank you so much.... again