Спросите Windows 7 - какая программа открывает этот файл по умолчанию - PullRequest
1 голос
/ 19 января 2011

Является ли переход по реестру лучшим способом узнать, по какому пути программы открывается это расширение файла (.avi) в Windows 7? или есть лучший API для использования?

Как правильно перемещаться в реестре? Когда я установил проигрыватель DivX, я заметил, что он украл расширение .avi из проигрывателя VLC. Я поместил файл поверх файла и установил для программы по умолчанию VLC, но не вижу, где это хранится в HKCU.

Моя конечная цель - иметь программу, которая знает о приложении, с которым связано расширение файла. И я хотел бы попросить об этом операционную систему вместо хранения моих собственных независимых данных поиска.

1 Ответ

5 голосов
/ 19 января 2011

Вы не говорите, на каком языке вы разрабатываете, однако вы должны сделать это с помощью вызова assocquerystring на shlwapi.dll.

Функция API assocquerystring вернет файлассоциативные данные без необходимости вручную погружаться в реестр и иметь дело с демонами, которые находятся внутри.Большинство языков будут поддерживать вызов Windows API, так что вам будет хорошо.

Дополнительную информацию можно найти здесь:

http://www.pinvoke.net/default.aspx/shlwapi.assocquerystring

и здесь:

http://msdn.microsoft.com/en-us/library/bb773471%28VS.85%29.aspx

РЕДАКТИРОВАТЬ : Пример кода:

private void SomeProcessInYourApp()
{
    // Get association for doc/avi
    string docAsscData = AssociationsHelper.GetAssociation(".doc"); // returns : docAsscData = "C:\\Program Files\\Microsoft Office\\Office12\\WINWORD.EXE"
    string aviAsscData = AssociationsHelper.GetAssociation(".avi"); // returns : aviAsscData = "C:\\Program Files\\Windows Media Player\\wmplayer.exe"

    // Get association for an unassociated extension
    string someAsscData = AssociationsHelper.GetAssociation(".blahdeblahblahblah"); // returns : someAsscData = "C:\\Windows\\system32\\shell32.dll"
}

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

    [Flags]
    enum AssocF
    {
        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
    }

    enum AssocStr
    {
        Command = 1,
        Executable,
        FriendlyDocName,
        FriendlyAppName,
        NoOpen,
        ShellNewValue,
        DDECommand,
        DDEIfExec,
        DDEApplication,
        DDETopic
    }

    public static string GetAssociation(string doctype)
    {
        uint pcchOut = 0;   // size of output buffer

        // First call is to get the required size of output buffer
        AssocQueryString(AssocF.Verify, AssocStr.Executable, doctype, null, null, ref pcchOut);

        // Allocate the output buffer
        StringBuilder pszOut = new StringBuilder((int)pcchOut);

        // Get the full pathname to the program in pszOut
        AssocQueryString(AssocF.Verify, AssocStr.Executable, doctype, null, pszOut, ref pcchOut);

        string doc = pszOut.ToString();
        return doc;
    }
}
...