ユーザプログラムメニューにリストされているすべてのアプリケーションを検索したい。私は次のルーチンを使用します:Shell32.dll .NETインターフェイスはOSによって異なる
private static void ProcessDirectoryLnkFiles(string path, bool recurse,
UpdateProcessFromLnkDelegate sProcFile)
{
try
{
string[] sPrograms = Directory.GetFiles(path, "*.lnk",
SearchOption.TopDirectoryOnly);
string[] sSubdirs = Directory.GetDirectories(path);
Shell32.Shell shell = new Shell32.Shell();
foreach (string p in sPrograms) {
Shell32.Folder sLinkFolder;
Shell32.FolderItem sLinkFolderItem;
Shell32.ShellLinkObject sLinkObject;
string sLinkFullpath;
// Get link full path
sLinkFullpath = Path.GetFullPath(p);
// Get link folder
sLinkFolder = shell.NameSpace(
Path.GetDirectoryName(sLinkFullpath));
// Get link item
sLinkFolderItem = sLinkFolder.Items().
Item(Path.GetFileName(sLinkFullpath));
// Get link object
sLinkObject = (Shell32.ShellLinkObject)
sLinkFolderItem.GetLink;
if (sLinkObject.Target.IsFolder == false)
sProcFile(sLinkObject);
}
if (recurse == true)
foreach (string dir in sSubdirs)
ProcessDirectoryLnkFiles(dir, true, sProcFile);
}
catch (UnauthorizedAccessException eUnauthorizedAccessException) {
sLog.Warn("Unable to iterate on directory {0} ({1}).",
path, eUnauthorizedAccessException.Message);
}
catch (IOException eIOException) {
sLog.Warn("Unable to iterate on directory {0} ({1}).",
path, eIOException.Message);
}
catch (COMException eCOMException) {
}
catch {
throw;
}
}
これは、Windows 7 x64でかなりうまく動作します。しかし残念ながら、Windows XP x86ではShell32.Shell
オブジェクトはShell32.Shell.Target
プロパティを宣言しません。このコードをWindows XPで実行させるにはどうすればよいですか?
これはおそらく助けになるかもしれません:http://www.programmersheaven.com/mb/VBNET/388996/388996/using-shell32-on-different-operating-systems/? – AFract
あなたは 'catch {throw; } '。 – SLaks