AssocQueryString (shlwapi)
Last changed: -84.233.245.68

.
Summary

C# Signature:

[DllImport("Shlwapi.dll", SetLastError=true, CharSet = CharSet.Auto)]
static extern uint AssocQueryString(AssocF flags, AssocStr str, string pszAssoc, string pszExtra,
   [Out] StringBuilder pszOut, ref uint pcchOut);

VB Signature:

<DllImport("Shlwapi.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function AssocQueryString(ByVal flags As UInteger, ByVal str As UInteger, ByVal pszAssoc As String, _
       ByVal pszExtra As String, ByVal pszOut As Text.StringBuilder, ByRef pcchOut As UInteger) As UInteger
    End Function

User-Defined Types:

  [Flags]
  enum AssocF : uint
  {
    None = 0,
    Init_NoRemapCLSID = 0x1,
    Init_ByExeName = 0x2,
    Open_ByExeName = 0x2,
    Init_DefaultToStar = 0x4,
    Init_DefaultToFolder = 0x8,
    NoUserSettings = 0x10,
    NoTruncate = 0x20,
    Verify = 0x40,
    RemapRunDll = 0x80,
    NoFixUps = 0x100,
    IgnoreBaseClass = 0x200,
    Init_IgnoreUnknown = 0x400,
    Init_FixedProgId = 0x800,
    IsProtocol = 0x1000,
    InitForFile = 0x2000,
  }

  enum AssocStr
  {
    Command = 1,
    Executable,
    FriendlyDocName,
    FriendlyAppName,
    NoOpen,
    ShellNewValue,
    DDECommand,
    DDEIfExec,
    DDEApplication,
    DDETopic,
    InfoTip,
    QuickTip,
    TileInfo,
    ContentType,
    DefaultIcon,
    ShellExtension,
    DropTarget,
    DelegateExecute,
    SupportedUriProtocols,
    Max,
  }

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

Also see http://www.pinvoke.net/default.aspx/shell32.findexecutable (though this method is preferred, see http://visualstudiomagazine.com/articles/2009/10/13/finding-an-associated-executable.aspx).

Tips & Tricks:

Please add some!

Sample Code:

    static string AssocQueryString(AssocStr association, string extension)
    {
     uint length = 0;
     uint ret = AssocQueryString(AssocF.None, association, extension, null, null, ref length);
     if (ret != 1) //expected S_FALSE
     {
         throw new InvalidOperationException("Could not determine associated string");
     }

     var sb = new StringBuilder((int)length); //(length-1) will probably work too as null termination is added
     ret = AssocQueryString(AssocF.None, association, extension, null, sb, ref length);
     if (ret != 0) //expected S_OK
     {
         throw new InvalidOperationException("Could not determine associated string");
     }

     return sb.ToString();
    }

Documentation