Michael T
Michael T

Reputation: 729

Find Path to any given exe file name

I know similar questions have been asked before but all the answers have been partial, for example suggesting I use AssocQueryString which I am doing. However I'm still failing to find some exe. For example the code below fails to find outlook.exe or firefox.exe - Typing outlook.exe into Windows Explorer address bar finds these almost instantley.

In the code below the exe fileName can be any local location on the users machine, it may or may not be on the users search path.

How can I improve this to find the files? (this is called from a 32 bit exe)

// for example, get actual full path to outlook.exe
string fullPath = FindPath("outlook.exe");

public static string FindPath(string fileName)
{
    uint length = UnsafeMethods.MAX_PATH;
    StringBuilder path = new StringBuilder((int)length);

    if (Path.GetDirectoryName(fileName) == string.Empty)
    {
        if (UnsafeMethods.AssocQueryString(UnsafeMethods.AssocF.OpenByExeName, UnsafeMethods.AssocStr.Executable, fileName, null, path, ref length) != 0)
        {
            IntPtr filePart = IntPtr.Zero;
            IntPtr wow64Value = IntPtr.Zero;

            // try 64 bit path
            UnsafeMethods.Wow64DisableWow64FsRedirection(ref wow64Value);
            bool success = UnsafeMethods.SearchPath(null, fileName, null, path.Capacity, path, ref filePart) > 0;
            UnsafeMethods.Wow64RevertWow64FsRedirection(wow64Value);

            if (!success)
            {
                // try 32 bit path
                success = UnsafeMethods.SearchPath(null, fileName, null, path.Capacity, path, ref filePart) > 0;
            }
        }

        return path.ToString();
    }
    else
    {
        return fileName;
    }
}

Upvotes: 0

Views: 410

Answers (1)

Michael T
Michael T

Reputation: 729

It seems there are many places to look to find the path to an exe. While the original code above works, it is not an exhaustive search and you also need to look in the registry key SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\ and also check the SpecialFolders Windows, System and SystemX86 (https://learn.microsoft.com/en-us/dotnet/api/system.environment.specialfolder?view=netframework-4.7.2)

Upvotes: 1

Related Questions