• Welcome to Theos PowerBasic Museum 2017.

ItypeLib use big endian or little endian?

Started by Lutfie Ahmad, February 26, 2009, 02:58:20 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Lutfie Ahmad

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?

José Roca

#1
 
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.


Lutfie Ahmad

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