getprivateprofilesectionnames (kernel32)
Last changed: -1.52.173.5

.
Summary
Retrieves the names of all sections in an initialization file.
Note
This function is provided only for compatibility with 16-bit Windows-based applications. Applications should store initialization information in the registry.

VB.Net Signature

<DllImport("kernel32.dll")> _
    Shared Function GetPrivateProfileSectionNames( _
    ByVal lpszReturnBuffer As IntPtr, ByVal nSize As System.Int32, ByVal lpFileName As String) As System.Int32
    End Function

C# Signature:

[DllImport("kernel32.dll")]
static extern uint GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer,
   uint nSize, string lpFileName);

Sample Code:

    Dim profiles As New Collections.Specialized.StringCollection
    Dim ptr As IntPtr = Marshal.StringToHGlobalAnsi(New String(vbNullChar, 1024))
    Dim len As Int32 = GetPrivateProfileSectionNames(ptr, 1024, IniPath)
    Dim buff As String = Marshal.PtrToStringAnsi(ptr, len)
    Marshal.FreeHGlobal(ptr)
    Dim sb As New StringBuilder
     '
    '    I can't believe people write shit code like this.
    '
    For ii As Integer = 0 To len - 1
        Dim c As Char = buff.Chars(ii)
        If c = vbNullChar Then
        profiles.Add(sb.ToString)
        sb.Length = 0
        Else
        sb.Append(c)
        End If
    Next

Alternative C# Signature:

[DllImport("kernel32.dll",CharSet=CharSet.Auto)]
static extern uint GetPrivateProfileSectionNames(IntPtr lpszReturnBuffer,
   uint nSize, string lpFileName);

Alternative Sample Code:

//similar to above, but use of CharSet in DllImport allows use of Marshal.PtrToStringAuto

public string[] SectionNames()

{

    uint MAX_BUFFER = 32767;
    IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER);
    uint bytesReturned = GetPrivateProfileSectionNames(pReturnedString, MAX_BUFFER, m_iniFile);
    if (bytesReturned == 0)
    return null;
    string ret = Marshal.PtrToStringAnsi(pReturnedString, (int)(bytesReturned * 2));
    Marshal.FreeCoTaskMem(pReturnedString);

    // convert ASCII string to Unicode string
    byte[] bytes = Encoding.ASCII.GetBytes(ret);
    string local = Encoding.Unicode.GetString(bytes);

    //use of Substring below removes terminating null for split
    return local.Substring(0, local.Length - 1).Split('\0');

}

Alternative Managed API:

Do you know one? Please contribute it!

Documentation