Any advice here would be great. I am dealing with a lot of winapi calls recently and have come across one structure that contains a 128byte long TCHAR. Basically its asking for a continuous inline block of 128 bytes.
The only solution i know of in blitzmax is to have duplicate fields that fill the amount of specified space. This works ok, but reading things out like strings is highly inefficient and creates BLOATED code.
Below I have an example of said issue. I could pass a block of memory to the function call as another solution but I was just wondering if there is a more user-friendly way ?
example:
Strict
Extern "win32"
Function _GetVersionEx(versioninfo:Byte Ptr) = "GetVersionExA@4"
Function _GetLastError:Int() = "GetLastError@0"
End Extern
Function GetWindowsVersion:String()
Select OSVERSIONINFO.instance.platformid
Case 0
Return "win32"
Case 1
Select OSVERSIONINFO.instance.minorversion
Case 0
Return "95"
Case 90
Return "me"
Case 10
Return "98"
End Select
Case 2
Select OSVERSIONINFO.instance.majorversion
Case 5
Select OSVERSIONINFO.instance.minorversion
Case 0
Return "2000"
Case 1
Return "xp"
End Select
Case 6
Return "vista"
Default
Return "nt"
End Select
End Select
End Function
Function GetWindowsBuild:Int()
Return OSVERSIONINFO.instance.buildnumber
End Function
Function GetWindowsServicePack:String()
Return OSVERSIONINFO.instance.csdversion()
End Function
Type OSVERSIONINFO
Global instance:OSVERSIONINFO = New OSVERSIONINFO
Field osversioninfosize:Int
Field majorversion:Int
Field minorversion:Int
Field buildnumber:Int
Field platformid:Int
Field csdversion_0:Byte
Field csdversion_1:Byte
Field csdversion_2:Byte
Field csdversion_3:Byte
Field csdversion_4:Byte
Field csdversion_5:Byte
Field csdversion_6:Byte
Field csdversion_7:Byte
Field csdversion_8:Byte
Field csdversion_9:Byte
Field csdversion_10:Byte
Field csdversion_11:Byte
Field csdversion_12:Byte
Field csdversion_13:Byte
Field csdversion_14:Byte
Field csdversion_15:Byte
Field csdversion_16:Byte
Field csdversion_17:Byte
Field csdversion_18:Byte
Field csdversion_19:Byte
Field csdversion_20:Byte
Field csdversion_21:Byte
Field csdversion_22:Byte
Field csdversion_23:Byte
Field csdversion_24:Byte
Field csdversion_25:Byte
Field csdversion_26:Byte
Field csdversion_27:Byte
Field csdversion_28:Byte
Field csdversion_29:Byte
Field csdversion_30:Byte
Field csdversion_31:Byte
Field csdversion_32:Byte
Field csdversion_33:Byte
Field csdversion_34:Byte
Field csdversion_35:Byte
Field csdversion_36:Byte
Field csdversion_37:Byte
Field csdversion_38:Byte
Field csdversion_39:Byte
Field csdversion_40:Byte
Field csdversion_41:Byte
Field csdversion_42:Byte
Field csdversion_43:Byte
Field csdversion_44:Byte
Field csdversion_45:Byte
Field csdversion_46:Byte
Field csdversion_47:Byte
Field csdversion_48:Byte
Field csdversion_49:Byte
Field csdversion_50:Byte
Field csdversion_51:Byte
Field csdversion_52:Byte
Field csdversion_53:Byte
Field csdversion_54:Byte
Field csdversion_55:Byte
Field csdversion_56:Byte
Field csdversion_57:Byte
Field csdversion_58:Byte
Field csdversion_59:Byte
Field csdversion_60:Byte
Field csdversion_61:Byte
Field csdversion_62:Byte
Field csdversion_63:Byte
Field csdversion_64:Byte
Field csdversion_65:Byte
Field csdversion_66:Byte
Field csdversion_67:Byte
Field csdversion_68:Byte
Field csdversion_69:Byte
Field csdversion_70:Byte
Field csdversion_71:Byte
Field csdversion_72:Byte
Field csdversion_73:Byte
Field csdversion_74:Byte
Field csdversion_75:Byte
Field csdversion_76:Byte
Field csdversion_77:Byte
Field csdversion_78:Byte
Field csdversion_79:Byte
Field csdversion_80:Byte
Field csdversion_81:Byte
Field csdversion_82:Byte
Field csdversion_83:Byte
Field csdversion_84:Byte
Field csdversion_85:Byte
Field csdversion_86:Byte
Field csdversion_87:Byte
Field csdversion_88:Byte
Field csdversion_89:Byte
Field csdversion_90:Byte
Field csdversion_91:Byte
Field csdversion_92:Byte
Field csdversion_93:Byte
Field csdversion_94:Byte
Field csdversion_95:Byte
Field csdversion_96:Byte
Field csdversion_97:Byte
Field csdversion_98:Byte
Field csdversion_99:Byte
Field csdversion_100:Byte
Field csdversion_101:Byte
Field csdversion_102:Byte
Field csdversion_103:Byte
Field csdversion_104:Byte
Field csdversion_105:Byte
Field csdversion_106:Byte
Field csdversion_107:Byte
Field csdversion_108:Byte
Field csdversion_109:Byte
Field csdversion_110:Byte
Field csdversion_111:Byte
Field csdversion_112:Byte
Field csdversion_113:Byte
Field csdversion_114:Byte
Field csdversion_115:Byte
Field csdversion_116:Byte
Field csdversion_117:Byte
Field csdversion_118:Byte
Field csdversion_119:Byte
Field csdversion_120:Byte
Field csdversion_121:Byte
Field csdversion_122:Byte
Field csdversion_123:Byte
Field csdversion_124:Byte
Field csdversion_125:Byte
Field csdversion_126:Byte
Field csdversion_127:Byte
Method New:Int()
osversioninfosize = SizeOf(Self)
_GetVersionEx(Self)
End Method
Method csdversion:String()
Local temp_string:String = ""
If (csdversion_0>0) temp_string:+Chr(csdversion_0)
If (csdversion_1>0) temp_string:+Chr(csdversion_1)
If (csdversion_2>0) temp_string:+Chr(csdversion_2)
If (csdversion_3>0) temp_string:+Chr(csdversion_3)
If (csdversion_4>0) temp_string:+Chr(csdversion_4)
If (csdversion_5>0) temp_string:+Chr(csdversion_5)
If (csdversion_6>0) temp_string:+Chr(csdversion_6)
If (csdversion_7>0) temp_string:+Chr(csdversion_7)
If (csdversion_8>0) temp_string:+Chr(csdversion_8)
If (csdversion_9>0) temp_string:+Chr(csdversion_9)
If (csdversion_10>0) temp_string:+Chr(csdversion_10)
If (csdversion_11>0) temp_string:+Chr(csdversion_11)
If (csdversion_12>0) temp_string:+Chr(csdversion_12)
If (csdversion_13>0) temp_string:+Chr(csdversion_13)
If (csdversion_14>0) temp_string:+Chr(csdversion_14)
If (csdversion_15>0) temp_string:+Chr(csdversion_15)
If (csdversion_16>0) temp_string:+Chr(csdversion_16)
If (csdversion_17>0) temp_string:+Chr(csdversion_17)
If (csdversion_18>0) temp_string:+Chr(csdversion_18)
If (csdversion_19>0) temp_string:+Chr(csdversion_19)
If (csdversion_20>0) temp_string:+Chr(csdversion_20)
If (csdversion_21>0) temp_string:+Chr(csdversion_21)
If (csdversion_22>0) temp_string:+Chr(csdversion_22)
If (csdversion_23>0) temp_string:+Chr(csdversion_23)
If (csdversion_24>0) temp_string:+Chr(csdversion_24)
If (csdversion_25>0) temp_string:+Chr(csdversion_25)
If (csdversion_26>0) temp_string:+Chr(csdversion_26)
If (csdversion_27>0) temp_string:+Chr(csdversion_27)
If (csdversion_28>0) temp_string:+Chr(csdversion_28)
If (csdversion_29>0) temp_string:+Chr(csdversion_29)
If (csdversion_30>0) temp_string:+Chr(csdversion_30)
If (csdversion_31>0) temp_string:+Chr(csdversion_31)
If (csdversion_32>0) temp_string:+Chr(csdversion_32)
If (csdversion_33>0) temp_string:+Chr(csdversion_33)
If (csdversion_34>0) temp_string:+Chr(csdversion_34)
If (csdversion_35>0) temp_string:+Chr(csdversion_35)
If (csdversion_36>0) temp_string:+Chr(csdversion_36)
If (csdversion_37>0) temp_string:+Chr(csdversion_37)
If (csdversion_38>0) temp_string:+Chr(csdversion_38)
If (csdversion_39>0) temp_string:+Chr(csdversion_39)
If (csdversion_40>0) temp_string:+Chr(csdversion_40)
If (csdversion_41>0) temp_string:+Chr(csdversion_41)
If (csdversion_42>0) temp_string:+Chr(csdversion_42)
If (csdversion_43>0) temp_string:+Chr(csdversion_43)
If (csdversion_44>0) temp_string:+Chr(csdversion_44)
If (csdversion_45>0) temp_string:+Chr(csdversion_45)
If (csdversion_46>0) temp_string:+Chr(csdversion_46)
If (csdversion_47>0) temp_string:+Chr(csdversion_47)
If (csdversion_48>0) temp_string:+Chr(csdversion_48)
If (csdversion_49>0) temp_string:+Chr(csdversion_49)
If (csdversion_50>0) temp_string:+Chr(csdversion_50)
If (csdversion_51>0) temp_string:+Chr(csdversion_51)
If (csdversion_52>0) temp_string:+Chr(csdversion_52)
If (csdversion_53>0) temp_string:+Chr(csdversion_53)
If (csdversion_54>0) temp_string:+Chr(csdversion_54)
If (csdversion_55>0) temp_string:+Chr(csdversion_55)
If (csdversion_56>0) temp_string:+Chr(csdversion_56)
If (csdversion_57>0) temp_string:+Chr(csdversion_57)
If (csdversion_58>0) temp_string:+Chr(csdversion_58)
If (csdversion_59>0) temp_string:+Chr(csdversion_59)
If (csdversion_60>0) temp_string:+Chr(csdversion_60)
If (csdversion_61>0) temp_string:+Chr(csdversion_61)
If (csdversion_62>0) temp_string:+Chr(csdversion_62)
If (csdversion_63>0) temp_string:+Chr(csdversion_63)
If (csdversion_64>0) temp_string:+Chr(csdversion_64)
If (csdversion_65>0) temp_string:+Chr(csdversion_65)
If (csdversion_66>0) temp_string:+Chr(csdversion_66)
If (csdversion_67>0) temp_string:+Chr(csdversion_67)
If (csdversion_68>0) temp_string:+Chr(csdversion_68)
If (csdversion_69>0) temp_string:+Chr(csdversion_69)
If (csdversion_70>0) temp_string:+Chr(csdversion_70)
If (csdversion_71>0) temp_string:+Chr(csdversion_71)
If (csdversion_72>0) temp_string:+Chr(csdversion_72)
If (csdversion_73>0) temp_string:+Chr(csdversion_73)
If (csdversion_74>0) temp_string:+Chr(csdversion_74)
If (csdversion_75>0) temp_string:+Chr(csdversion_75)
If (csdversion_76>0) temp_string:+Chr(csdversion_76)
If (csdversion_77>0) temp_string:+Chr(csdversion_77)
If (csdversion_78>0) temp_string:+Chr(csdversion_78)
If (csdversion_79>0) temp_string:+Chr(csdversion_79)
If (csdversion_80>0) temp_string:+Chr(csdversion_80)
If (csdversion_81>0) temp_string:+Chr(csdversion_81)
If (csdversion_82>0) temp_string:+Chr(csdversion_82)
If (csdversion_83>0) temp_string:+Chr(csdversion_83)
If (csdversion_84>0) temp_string:+Chr(csdversion_84)
If (csdversion_85>0) temp_string:+Chr(csdversion_85)
If (csdversion_86>0) temp_string:+Chr(csdversion_86)
If (csdversion_87>0) temp_string:+Chr(csdversion_87)
If (csdversion_88>0) temp_string:+Chr(csdversion_88)
If (csdversion_89>0) temp_string:+Chr(csdversion_89)
If (csdversion_90>0) temp_string:+Chr(csdversion_90)
If (csdversion_91>0) temp_string:+Chr(csdversion_91)
If (csdversion_92>0) temp_string:+Chr(csdversion_92)
If (csdversion_93>0) temp_string:+Chr(csdversion_93)
If (csdversion_94>0) temp_string:+Chr(csdversion_94)
If (csdversion_95>0) temp_string:+Chr(csdversion_95)
If (csdversion_96>0) temp_string:+Chr(csdversion_96)
If (csdversion_97>0) temp_string:+Chr(csdversion_97)
If (csdversion_98>0) temp_string:+Chr(csdversion_98)
If (csdversion_99>0) temp_string:+Chr(csdversion_99)
If (csdversion_100>0) temp_string:+Chr(csdversion_100)
If (csdversion_101>0) temp_string:+Chr(csdversion_101)
If (csdversion_102>0) temp_string:+Chr(csdversion_102)
If (csdversion_103>0) temp_string:+Chr(csdversion_103)
If (csdversion_104>0) temp_string:+Chr(csdversion_104)
If (csdversion_105>0) temp_string:+Chr(csdversion_105)
If (csdversion_106>0) temp_string:+Chr(csdversion_106)
If (csdversion_107>0) temp_string:+Chr(csdversion_107)
If (csdversion_108>0) temp_string:+Chr(csdversion_108)
If (csdversion_109>0) temp_string:+Chr(csdversion_109)
If (csdversion_110>0) temp_string:+Chr(csdversion_110)
If (csdversion_111>0) temp_string:+Chr(csdversion_111)
If (csdversion_112>0) temp_string:+Chr(csdversion_112)
If (csdversion_113>0) temp_string:+Chr(csdversion_113)
If (csdversion_114>0) temp_string:+Chr(csdversion_114)
If (csdversion_115>0) temp_string:+Chr(csdversion_115)
If (csdversion_116>0) temp_string:+Chr(csdversion_116)
If (csdversion_117>0) temp_string:+Chr(csdversion_117)
If (csdversion_118>0) temp_string:+Chr(csdversion_118)
If (csdversion_119>0) temp_string:+Chr(csdversion_119)
If (csdversion_120>0) temp_string:+Chr(csdversion_120)
If (csdversion_121>0) temp_string:+Chr(csdversion_121)
If (csdversion_122>0) temp_string:+Chr(csdversion_122)
If (csdversion_123>0) temp_string:+Chr(csdversion_123)
If (csdversion_124>0) temp_string:+Chr(csdversion_124)
If (csdversion_125>0) temp_string:+Chr(csdversion_125)
If (csdversion_126>0) temp_string:+Chr(csdversion_126)
If (csdversion_127>0) temp_string:+Chr(csdversion_127)
Return temp_string
End Method
End Type
|