[DllImport("kernel32.dll")]
static extern uint GetPrivateProfileSection(string lpAppName,
IntPtr lpReturnedString, uint nSize, string lpFileName);
<DllImport("kernel32.dll", SetLastError:=True)> _
Private Shared Function GetPrivateProfileSection(ByVal lpAppName As String, _
ByVal lpReturnedString As IntPtr, _
ByVal nSize As Integer, _
ByVal lpFileName As String) As Short
End Function
None.
None.
In using this function, I discovered that the subsequent call to Marshal.PtrToStringAnsi(lpReturnedString) would only return the first Name=Value pair. I used the following wrapper around this function to convert lpReturnedString into a string[]
public static bool GetPrivateProfileSection(string appName, string fileName, out string[] section)
{
section = null;
if (!System.IO.File.Exists(fileName))
return false;
uint MAX_BUFFER = 32767;
IntPtr pReturnedString = Marshal.AllocCoTaskMem((int)MAX_BUFFER);
uint bytesReturned = GetPrivateProfileSection(appName, pReturnedString, MAX_BUFFER, fileName);
if ((bytesReturned == MAX_BUFFER - 2) ||(bytesReturned == 0))
return false;
System.Text.StringBuilder returnedString = new System.Text.StringBuilder((int)bytesReturned);
//bytesReturned -1 to remove trailing \0
for (int i = 0; i < bytesReturned-1; i++)
returnedString.Append((char)Marshal.ReadByte(new IntPtr((uint)pReturnedString + (uint)i)));
Marshal.FreeCoTaskMem(pReturnedString);
section = returnedString.ToString().Split('\0');
return true;
}
Questions? ShawnVi@gmail.com
Private Const MaxIniBuffer As Integer = &H7FFF
Public Shared Function ReadSection(ByVal filename As String, ByVal section As String) As System.Collections.Specialized.NameValueCollection
Dim pBuffer As IntPtr
Dim bytesRead As Byte
Dim sectionData As New System.Text.StringBuilder(MaxIniBuffer)
Dim values As New System.Collections.Specialized.NameValueCollection
Dim pos As Integer ' seperator position
Dim name, value As String
If (Not System.IO.File.Exists(filename)) Then
Return Nothing
End If
' get a pointer to the unmanaged memory
pBuffer = Marshal.AllocHGlobal(MaxIniBuffer)
bytesRead = GetPrivateProfileSection(section, pBuffer, MaxIniBuffer, filename)
If (bytesRead > 0) Then
For i As Integer = 0 To bytesRead - 1
sectionData.Append(Convert.ToChar(Marshal.ReadByte(pBuffer, i)))
Next
sectionData.Remove(sectionData.Length - 1, 1)
For Each line As String In sectionData.ToString().Split(Convert.ToChar(0))
' locate the seperator
pos = line.IndexOf("=")
If (pos > -1) Then
' get values
name = line.Substring(0, pos)
value = line.Substring(pos + 1)
' add to collection
values.Add(name, value)
End If
Next
Else
values = Nothing
End If
' release the unmanaged memory
Marshal.FreeHGlobal(pBuffer)
' return collection or Nothing if we weren't able to get anything
Return values
End Function
Questions? nramsbottom@hotmail.com
Do you know one? Please contribute it!