2011-01-19 1 views
1

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

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

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

+0

Просмотр реестра используя какой язык программирования? –

ответ

5

Вы не говорите, на каком языке вы работаете, но вы должны сделать это, позвонив по телефону 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

EDIT: Некоторые примеры кода:

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; 
    } 
} 
+0

+1 за то, что вы не заглядываете в реестр самостоятельно. – asveikau

 Смежные вопросы

  • Нет связанных вопросов^_^