[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);
<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
[DllImport("KERNEL32.DLL", CharSet=CharSet::Auto, EntryPoint="GetPrivateProfileString")]
static UInt32 GetPrivateProfileString(
String^ lpAppName,
String^ lpKeyName,
String^ lpDefault,
StringBuilder^ lpReturnedString,
UInt32 nSize,
String^ lpFileName);
None.
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.
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).
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
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