GetPrivateProfileString (kernel32)
Last changed: -131.107.0.95

.
Summary

C# Signature:

[DllImport("kernel32.dll", CharSet=CharSet.Unicode)]
static extern uint GetPrivateProfileString(
   string lpAppName,
   string lpKeyName,
   string lpDefault,
   StringBuilder lpReturnedString,
   uint nSize,
   string lpFileName);

and/or

[DllImport("kernel32.dll", CharSet=CharSet.Unicode)]
static extern uint GetPrivateProfileString(
   string lpAppName,
   string lpKeyName,
   string lpDefault,
   [In, Out] char[] lpReturnedString,
   uint nSize,
   string lpFileName);

VB.NET Signature:

     <DllImport("kernel32.dll", SetLastError:=True)> _
    Private Shared Function GetPrivateProfileString(ByVal lpAppName As String, _
                            ByVal lpKeyName As String, _
                            ByVal lpDefault As String, _
                            ByVal lpReturnedString As StringBuilder, _
                            ByVal nSize As Integer, _
                            ByVal lpFileName As String) As Integer
    End Function

C++ Signature:

[DllImport("KERNEL32.DLL", CharSet=CharSet::Auto, EntryPoint="GetPrivateProfileString")]
static UInt32 GetPrivateProfileString(
   String^ lpAppName,
   String^ lpKeyName,
   String^ lpDefault,
   StringBuilder^ lpReturnedString,
   UInt32 nSize,
   String^ lpFileName);

User-Defined Types:

None.

Notes:

To avoid casting of the StringBuilder.Capacity to uint you can also declare the nSize parameter as int.

If you need to get all the section names by passing a null lpAppName or all the key names by passing a null lpKeyName, then you'll need to use a technique like is shown for GetPrivateProfileSection to handle the double null-terminated result. .NET's marshaler will truncate the StringBuilder at the first null it finds, so to get back the full double null-terminated result string, you have to manage your own memory buffer.

An alternative to the technique above is to use a char[] in place of a StringBuilder when you need to obtain all key names or all section names. The char[] will not truncate at the first null it finds.

Tips & Tricks:

If passing a char[] for the purposes of getting a null-tokenized list of section or key names, you can afterward pass this char[] to the constructor of a new String, and use the String's Split('\0') to easily obtain a list of your section or key names.

There's a simple way to determine with this function if the provided key exists or not. F.e. if you define lpDefault as empty String ("" or vbNullString or Nothing) you'll not know if the returned value is actually the sign for a missing key or just the read value. If you pass f.e. vbNullChar along, you'll receive an empty String if the value is an empty String, and a vbNullChar if the key is missing (both read 0 characters).

Sample Code:

using System;
using System.Runtime.InteropServices;
using System.Text;
namespace GPPS
{
   class Class1
   {
     static void Main(string[] args)
     {
       StringBuilder sb = new StringBuilder(500);
       uint res = GetPrivateProfileString("AppName", "KeyName", "", sb, (uint)sb.Capacity, @"c:\test.ini");
       Console.WriteLine(sb.ToString());
     }
       [DllImport("kernel32.dll")]
       static extern uint GetPrivateProfileString(
     string lpAppName, string lpKeyName, string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);
   }
}

VB.NET Sample

Imports System.Runtime.InteropServices
Imports System.Text
Module1
    Private Declare Auto Function GetPrivateProfileString Lib "kernel32" (ByVal lpAppName As String, _
                ByVal lpKeyName As String, _
                ByVal lpDefault As String, _
                ByVal lpReturnedString As StringBuilder, _
                ByVal nSize As Integer, _
                ByVal lpFileName As String) As Integer

    Sub Main()

    Dim res As Integer
    Dim sb As StringBuilder

    sb = New StringBuilder(500)
    res = GetPrivateProfileString("AppName", "KeyName", "", sb, sb.Capacity, "c:\test.ini")
    Console.WriteLine("GetPrivateProfileStirng returned : " & res.ToString())
    Console.WriteLine("KeyName is : " & sb.ToString())

    End Sub
End Module

Alternative Managed API:

The above C# sample code does not work to retrieve section names or key names. The issue is you have to pass 0 rather than null for the unspecified parameters. Here is a good managed API:

http://www.codeproject.com/KB/files/INI_File_Enumerator.aspx

Documentation