getprivateprofilestring (kernel32)
Last changed: -131.107.0.95

.
Summary

C# Signature:

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

and/or

[DllImport("kernel32.dll")]
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

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.

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:

Do you know one? Please contribute it!

Documentation