PathUnExpandEnvStrings (shlwapi)
Last changed: -202.74.138.1

.
Summary
Takes a fully qualified path, and replaces folder names with their associated environment strings.

C# Signature:

[DllImport("shlwapi.dll", CharSet=CharSet.Auto)]
static extern bool PathUnExpandEnvStrings(string pszPath, [Out] StringBuilder pszBuf, int cchBuf);

VB.NET Signature:

<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

VB.NET Signature:

Public Declare Function PathUnExpandEnvStrings Lib "shlwapi" Alias "PathUnExpandEnvStringsA" _
        (ByVal lpSrc As String, _
         ByVal lpDst As String, _
         ByVal nSize As Long) As Long

Notes:

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.

Tips & Tricks:

Please add some!

Sample Code C#:

StringBuilder sb = new StringBuilder(MAX_PATH-1);
bool b = PathUnExpandEnvStrings(@"C:\Program Files\Test", sb, sb.Capacity);
// Result: b == true && sb.ToString() == @"%ProgramFiles%\Test"

Sample Code VB.NET:

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

Alternative Managed API:

Do you know one? Please contribute it!

Documentation