Although most settings can be stored in the registry these days, it is sometimes more practical to store settings in an INI file (e.g. you want to be able to manually go and change those settings regularly).

There are predefined functions in the Windows API to allow you to read and write properties to/from INI files:

  ' to write values to an INI file.
  Declare Function WritePrivateProfileString _
    Lib "kernel32" Alias "WritePrivateProfileStringA" _
    (ByVal lpApplicationname As String, ByVal _
    lpKeyName As Any, ByVal lsString As Any, _
    ByVal lplFilename As String) As Long
  
  ' to read values from an INI file
  Declare Function GetPrivateProfileString Lib _
    "kernel32" Alias "GetPrivateProfileStringA" _
    (ByVal lpApplicationname As String, ByVal _
    lpKeyName As String, ByVal lpDefault As _
    String, ByVal lpReturnedString As String, _
    ByVal nSize As Long, ByVal lpFileName As _
    String) As Long

For example, if you have the following INI file:

  [MyHeading]
  MyKey1=myValue1
  Dir=c:mydir
  File=hello.txt

You could read the value of the “File” key in the following way:

  Dim lngResult As Long
  Dim strFileName
  Dim strResult As String * 50
  strFileName = "C:MyIniFile.ini"
	
  lngResult = GetPrivateProfileString("MyHeading", _
    "File", strFileName, strResult, Len(strResult), _
    strFileName)

  If lngResult = 0 Then
    'An error has occurred
    Call MsgBox("An error has occurred", vbExclamation)
    Exit Sub
  Else
    MsgBox "The value is " & strResult
  End If

You could change the value of the same key in the following way:

  Dim lngResult As Long
  Dim strFileName
  strFileName = "C:MyIniFile.ini"
  lngResult = WritePrivateProfileString("MyHeading", "File", "NewValue", strFileName)

  If lngResult = 0 Then
    'An error has occurred
    Call MsgBox("An error has occurred", vbExclamation)
  Else
    MsgBox "The value has been changed"
  End If

Using the return value

The return value (in the example lngResult) specifies the length of the string that is being returned. A value of 0 means an error occurred, but if you want to use the string that is returned you need to do some work due to the fact that the string is the length specified (in the example 50). For example if you want to tell the user what was returned, you would code:

  MsgBox Left(strResult, lngResult) & " is the result."

which would effectively get the exact value returned rather than the padded version.