public IntPtr GetDisplayName(SIGDN sigdnName) {
if (sigdnName == SIGDN.FILESYSPATH) {
var result = new StringBuilder(512);
if (!Shell32.SHGetPathFromIDList(Pidl, result)) throw new ArgumentException();
return Marshal.StringToHGlobalUni(result.ToString());
}
else {
IShellFolder parentFolder = GetParent().GetIShellFolder();
IntPtr childPidl = Shell32.ILFindLastID(Pidl);
var builder = new StringBuilder(512);
var strret = new STRRET();
parentFolder.GetDisplayNameOf(childPidl, (SHGNO)((int)sigdnName & 0xffff), out strret);
ShlWapi.StrRetToBuf(ref strret, childPidl, builder, (uint)builder.Capacity);
return Marshal.StringToHGlobalUni(builder.ToString());
}
}