Ho scritto una soluzione funzionante con la funzione che ti ho citato:
codice:
Public Declare Ansi Function GetPrivateProfileSectionNames Lib "kernel32" Alias "GetPrivateProfileSectionNamesA" (ByVal lpszReturnBuffer As String, ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Public Function GetINIFileSections(ByVal INIFile As String, Optional ByVal bufferSize As Integer = 16384) As String()
Dim sb As New String(" "c, bufferSize)
Dim ret As Integer
ret = GetPrivateProfileSectionNames(sb, sb.Length, INIFile)
Select Case ret
Case 0
Throw New ArgumentException("Invalid INI file.", "INIFile")
Case sb.Length - 2
Throw New ArgumentException("The buffer is too small.", "bufferSize")
End Select
sb = sb.TrimEnd(" "c).TrimEnd(ControlChars.NullChar)
Return sb.Split(ControlChars.NullChar)
End Function
La funzione GetINIFileSections restituisce i nomi delle sezioni del file INI in un array di stringhe. Il nome (ed eventualmente il percorso) del file INI viene passato tramite il parametro INIFile, mentre la dimensione del buffer tramite il parametro bufferSize; quest'ultimo parametro è opzionale e la dimensione di default (16 KB) mi pare più che sufficiente per la maggior parte degli impieghi normali; in ogni caso puoi sempre passare un valore più grande (o più piccolo) specificando il parametro in questione. La funzione può sollevare due ArgumentException, una che informa che il file INI non è valido o non esiste, l'altra che notifica che il buffer non è sufficientemente grande. Possono essere distinte in un blocco Try...Catch dalla proprietà ParamName, che per la prima è "INIFile" e per la seconda "bufferSize".

Ah, dimenticavo... un esempio:
codice:
Sub Main()
Dim strArr() As String
Try
strArr = GetINIFileSections("win.ini")
Catch ex As ArgumentException When ex.ParamName = "INIFile"
Console.WriteLine("File INI non valido o non esistente.")
Return
Catch ex As ArgumentException When ex.ParamName = "bufferSize"
Console.WriteLine("Buffer insufficiente.")
Return
End Try
For Each str As String In strArr
Console.WriteLine(str)
Next
Console.ReadLine()
End Sub