• Welcome to Theos PowerBasic Museum 2017.

News:

Attachments are only available to registered users.
Please register using your full, real name.

Main Menu

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