[DllImport("shlwapi.dll", CharSet=CharSet.Auto)]
static extern bool PathUnExpandEnvStrings(string pszPath, [Out] StringBuilder pszBuf, int cchBuf);
<DllImport("shlwapi.dll", EntryPoint:="PathUnExpandEnvStringsW", SetLastError:=true, CharSet:=CharSet.Unicode)> _
Public Function PathUnExpandEnvStrings(<MarshalAs(UnmanagedType.LPTStr)>pszPath As String, _
<MarshalAs(UnmanagedType.LPTStr)>lpszPath As System.Text.StringBuilder, _
dx As Integer) As <MarshalAs(UnmanagedType.Bool)>Boolean
End Function
Public Declare Function PathUnExpandEnvStrings Lib "shlwapi" Alias "PathUnExpandEnvStringsA" _
(ByVal lpSrc As String, _
ByVal lpDst As String, _
ByVal nSize As Long) As Long
This is basically the inverse of ExpandEnvironmentStrings or Environment.ExpandEnvironmentVariables. Only Microsoft knows why this inverse function didn't make it's way into the framework.
Please add some!
StringBuilder sb = new StringBuilder(MAX_PATH-1);
bool b = PathUnExpandEnvStrings(@"C:\Program Files\Test", sb, sb.Capacity);
// Result: b == true && sb.ToString() == @"%ProgramFiles%\Test"
Dim sb As New System.Text.StringBuilder(1024)
Dim blnOK As Boolean = PathUnExpandEnvStrings("C:\Program Files\Test", sb, sb.Capacity)
Dim strUnExpandEnvStrings As String
If blnOK = True Then strUnExpandEnvStrings = sb.ToString ' Should be %ProgramFiles%\Test on English OS
Do you know one? Please contribute it!