"chunks" of memory in direct win api calls ??

BlitzMax Forums/MaxGUI Module/"chunks" of memory in direct win api calls ??

skn3(Posted 2007) [#1]
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



grable(Posted 2007) [#2]
Wow.. you dont realy need to use bytes, or read from them one at a time.

Use Longs and rather pad with smaller types, that should reduce the size of your type somewhat.

And when reading the string do something like this instead:
Local s:String = String.FromCString( VarPtr typ.csdversion)



skn3(Posted 2007) [#3]
Hmmmmm good point, I did not think of it in that sense.

Thanks!


Gabriel(Posted 2007) [#4]
I tend to use banks and then peek/poke between banks and types. That way you can have sensible, useful type fields. The overhead is very low since you don't tend to be doing this sort of thing every frame.