> On Jul 28, 10:56 am, "Nicholas Paldino [.NET/C# MVP]"
>
[quoted text clipped - 41 lines]
>
> Mark
> On Jul 28, 10:56 am, "Nicholas Paldino [.NET/C# MVP]"
>
[quoted text clipped - 41 lines]
>
> Mark
Hello all,
I did get a solution from Experts-Exchange and I had modified the
answer just slightly to obtain the results I was looking for. The
original thread can be found here.
http://www.experts-exchange.com/Microsoft/Development/.NET/Visual_CSharp/Q_23604
651.html#a22122165
It appears that the FindExecutable() is the classic solution and
there are a lot of postings of it. I did add the interface
GetFileAssociationFull() which uses the GetFileAssociation() interface
in conjunction with the registry to pull the full names just as the
"Open With" functionality of Windows Explorer does, or at least from
what I can tell. I have read else where that the function
FindExecutable() will fail if the extension is longer than 3
characters. I have not tried it out, but just a fair warning.
Mark
using System;
using System.IO;
using System.Text;
using System.Runtime.InteropServices;
using Microsoft.Win32;
sealed public class FileAssociation
{
[DllImport("shell32", EntryPoint = "FindExecutableA",
CharSet = CharSet.Ansi, SetLastError = true,
ExactSpelling = true)]
private static extern int FindExecutable(string lpFile,
string lpDirectory,
StringBuilder Result);
private static readonly string
HKCU_APP_FULLNAME = // HKEY_CURRENT_USER
@"Software\Microsoft\Windows\ShellNoRoam\MUICache";
const int MAX_PATH = 260,
ERROR_FILE_NO_ASSOCIATION = 31,
ERROR_FILE_NOT_FOUND = 2,
ERROR_PATH_NOT_FOUND = 3,
ERROR_FILE_SUCCESS = 32,
ERROR_BAD_FORMAT = 11;
public static string GetFileAssociation(string fileName)
{
StringBuilder result = new StringBuilder(MAX_PATH);
//lpFile: name of the file of interest
//lpDirectory: location of lpFile
//sResult: path and name of executable associated with lpFile
int success =
FindExecutable(Path.GetFileName(fileName),
Path.GetDirectoryName(fileName) + '\\', result);
switch (success)
{
case ERROR_FILE_NO_ASSOCIATION:
throw new InvalidOperationException("No association found");
case ERROR_FILE_NOT_FOUND:
throw new FileNotFoundException("File not found");
case ERROR_PATH_NOT_FOUND:
throw new DirectoryNotFoundException("Path not found");
case ERROR_BAD_FORMAT:
throw new InvalidOperationException("Bad format");
case ERROR_FILE_SUCCESS:
break;
}
return result.ToString();
}
public static string GetFileAssociationFull(string fileName)
{
string fileAssoc;
RegistryKey regKey;
try
{
fileAssoc = GetFileAssociation( fileName );
if ( fileAssoc != null && !fileAssoc.Equals( string.Empty ) )
{
// Find out if a key named HKCU_APP_FULLNAME exists in
// HKEY_CURRENT_USER If it exists, open it
regKey = Registry.CurrentUser.OpenSubKey( HKCU_APP_FULLNAME );
if ( regKey != null )
{
// Read the Full Application Name, if present
if ( regKey.GetValue( fileAssoc ) != null )
{
fileAssoc = regKey.GetValue( fileAssoc ).ToString();
}
// Release the resources that the registry variable was
using
regKey.Close();
}
}
}
catch( Exception e )
{
fileAssoc = string.Empty;
}
return fileAssoc;
}
}