2011-01-11 41 views
0

我想查找用户程序菜单中列出的每个应用程序。我使用以下例程:Shell32.dll .NET接口依赖于操作系统

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上运行?

+0

也许这可以帮助:http://www.programmersheaven.com/mb/VBNET/388996/388996/using-shell32-on-different-operating-systems/? – AFract

+4

你不需要'catch {throw; }'。 – SLaks

回答

1

使用Path属性,它为您提供目标路径。 System.IO.Directory.Exists()可以告诉你它是否是目录。

+0

如果能够获得这种信息避免全部使用Shell32,那将会很不错。 – ouflak