Alyce Nov 21, 2015
=WritePrivateProfileStructA Demo= //[[user:tsh73]]// ---- =Demonstration Program= Accompanies the article on [[@IniFiles|Initialization Files]] [[user:tsh73]] advises, "Run it, write it, read it, break it and try to write again." [[code format="lb"]] print " * WritePrivateProfileStructA / GetPrivateProfileStructA demo *" 'based on code by Richard Russel (80%) and by Stefan Pendl (15%) print dim info$(1, 1) 'for fileExists struct config, soundon$ as char[12], fullscreen as long SoundOn$ = "sound is on" config.soundon$.struct = SoundOn$ config.fullscreen.struct = 4 print "Initial values: [soundon$ = ";config.soundon$.struct;"] [fullscreen = ";config.fullscreen.struct;"]" if right$(DefaultDir$,1)<>"\" then DefaultDir$=DefaultDir$+"\" end if inifile$ = DefaultDir$ + "testINI.ini" print inifile$ if fileExists("", inifile$) then print "File exists" else print "No such file" print [mnu] print "1. Write INI" print "2. Read INI" print "3. Delete INI" print "4. Mess with INI with Notepad (don't forget to save it)" print "0. Exit" input "Enter selection: ";sel if sel = 0 then end if sel <1 or sel >4 then [mnu] select case sel case 1 size = len(config.struct) calldll #kernel32, "WritePrivateProfileStructA", _ "settings" as ptr, _ ' Section name "config" as ptr, _ ' Key name config as struct, _ ' Structure size as ulong, _ ' Size of structure inifile$ as ptr, ret as long if ret=0 then 'If the function successfully copies the string to the initialization file, the return value is nonzero. print "Some error happened" call displayError else print "Write OK" end if case 2 size = len(config.struct) calldll #kernel32, "GetPrivateProfileStructA", _ "settings" as ptr, _ ' Section name "config" as ptr, _ ' Key name config as struct, _ ' Structure size as ulong, _ ' Size of structure inifile$ as ptr, ret as long if ret=0 then 'If the function succeeds, the return value is nonzero. print "Some error happened" call displayError else print "Read OK" ' To retrieve the information from the struct: ' SoundOn$ = config.soundon$.struct FullScreen = config.fullscreen.struct print "SoundOn$: ";SoundOn$ print "FullScreen: ";FullScreen end if case 3 call tryToKill inifile$ if fileExists("", inifile$) then print "File still exists" else print "No such file" case 4 run "notepad.exe "+inifile$ end select goto [mnu] end sub tryToKill filename$ 'try to kill it 'don't care much if failed on error goto [handler] kill filename$ [handler] end sub sub displayError ' by Stefan Pendl calldll #kernel32, "GetLastError", _ ErrorCode as ulong dwFlags = _FORMAT_MESSAGE_FROM_SYSTEM nSize = 1024 lpBuffer$ = space$(nSize); chr$(0) dwMessageID = ErrorCode calldll #kernel32, "FormatMessageA", _ dwFlags as ulong, _ lpSource as ulong, _ dwMessageID as ulong, _ dwLanguageID as ulong, _ lpBuffer$ as ptr, _ nSize as ulong, _ Arguments as ulong, _ result as ulong print "Error "; ErrorCode; ": "; left$(lpBuffer$, result) end sub function fileExists(path$, filename$) files path$, filename$, info$() fileExists = val(info$(0, 0)) 'non zero is true end function [[code]]