Older Version Newer Version

Alyce 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]]