Garth J Lancaster
У меня есть ситуация, когда мне нужно быть уверенным, что на клиентской машине установлено "что-то", которое может отображать PDF-файлы ... мне все равно, что это такое, то есть Acrobat, Foxit ... этот метод может работать, но связан с предположением, что ничто другое не "взломало " расширение". pdf "в моем случае - в вашем случае расширение будет iirc". vlc"
public enum AssociationStr
{
Command = 1,
Executable,
FriendlyDocName,
FriendlyAppname,
NoOpen
}
и
[Flags]
public enum AssociationFlags
{
Init_NoRemapCLSID = 0x01,
Init_ByExeName = 0x02,
Init_DefaultToStar = 0x04,
Init_DefaultToFolder = 0x08,
NoUserSettings = 0x10,
NoTruncate = 0x20,
Verify = 0x40,
RemapRunDll = 0x80,
NoFixUps = 0x100,
IgnoreBaseClass = 0x200
}
затем с
[DllImport("Shlwapi.dll". CharSet = CharSet.Auto, SetLastError = true)]
static extern uint AssocQueryString(AssociationFlags flags, AssociationStr str, string pszAssoc, string pszExtra, [Out] StringBuilder sOut, [In][Out] ref uint nOut);
вы можете сделать :-
public static string GetAssociatedExecutable(string docType)
{
string tmpAssocExe = FileInfoByExtension(AssociationStr.Executable, docType;
return tmpAsocExe;
}
public static string FileInfoByExtension(AssociationStr assocStr, string docType)
{
uint pcchOut = 0;
if (AssocQueryString(AssociationFlags.Verify, assocStr, docType, null, null, ref pcchOut) != 1)
return null;
StringBuilder pszOut = new StringBuilder((int)pcchOut);
if (AssocQueryString(AssociationFlags.Verify, assocStr, docType, null, pszOut, ref pcchOut) != 0)
return null;
return pszOut.ToString();
}
Я вручную перепечатал это с моей машины разработчика, которая на данный момент отключена от сети (я печатаю на своем Mac), так что если есть какие-либо ошибки, сделайте Google для pinvoke AssocQueryString, и вы можете получить информацию - я думаю, что она изначально пришла из StackOverflow
О, если это не очевидно
// Usage
string whatRunsVLC = GetAssociatedExecutable(".vlc");
(Я думаю, что разделил "исполняемый файл" на его собственную функцию, потому что у меня также есть его вариант, чтобы получить DDEApplication)
[редактировать]
потребности
using System.Runtime.InteropServices;
где вы кладете "хорошие биты" этого [/edit]