2011-01-11 10 views
0

ユーザプログラムメニューにリストされているすべてのアプリケーションを検索したい。私は次のルーチンを使用します: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で実行させるにはどうすればよいですか?

+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

関連する問題