2012-02-15 8 views
0

私は愚かな質問であれば、ご容赦ください。しかし、私は実際に私が下に投稿しているコードをどのように使うことができるかを知る必要があります。私はフォームからそれをコピーしました。私はフォルダ/ファイルのアイコンのオーバーレイを実装したい。だから検索中、私は以下のコードを発見した。アイコンのオーバーレイはC#

public sealed class ShellInterop 
    { 

     private ShellInterop() 
     { 
     } 
     [DllImport("shell32.dll")] 
     public static extern void SHChangeNotify(int eventID, uint flags, IntPtr item1, IntPtr item2); 

    } 

    [ComVisible(false)] 
    [ComImport] 
    [Guid("0C6C4200-C589-11D0-999A-00C04FD655E1")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
    public interface IShellIconOverlayIdentifier 
    { 

     [PreserveSig] 
     int IsMemberOf([MarshalAs(UnmanagedType.LPWStr)]string path, uint attributes); 

     [PreserveSig] 
     int GetOverlayInfo(
      IntPtr iconFileBuffer, 
      int iconFileBufferSize, 
      out int iconIndex, 
      out uint flags); 

     [PreserveSig] 
     int GetPriority(out int priority); 
    } 

    [ComVisible(true)] 
    [Guid("B8FA9E43-38E6-4654-8A13-FF905AD22CE5")] 
    public class MyIconOverlay : IShellIconOverlayIdentifier 
    { 

     #region IShellIconOverlayIdentifier Members 
     public int IsMemberOf(string path, uint attributes) 
     { 
      //Show everything with icon overlay 
      return 0; // S_OK 
     } 

     public int GetOverlayInfo(IntPtr iconFileBuffer, int 
     iconFileBufferSize, 
     out int iconIndex, out uint flags) 
     { 

      System.Diagnostics.Debug.WriteLine(string.Format("GetOverlayInfo::{0}", iconFileBuffer)); 

      System.Diagnostics.Debug.WriteLine(string.Format("GetOverlayInfo::{0}", iconFileBufferSize)); 
      string fname = @"c:\NormalIcon.ico"; 

      int bytesCount = System.Text.Encoding.Unicode.GetByteCount(fname); 

      System.Diagnostics.Debug.WriteLine(string.Format("GetOverlayInfo::{0}", bytesCount)); 

      byte[] bytes = System.Text.Encoding.Unicode.GetBytes(fname); 

      if (bytes.Length + 2 < iconFileBufferSize) 
      { 
       for (int i = 0; i < bytes.Length; i++) 
       { 
        Marshal.WriteByte(iconFileBuffer, i, bytes[i]); 
       } 
       //write the "\0\0" 
       Marshal.WriteByte(iconFileBuffer, bytes.Length, 0); 
       Marshal.WriteByte(iconFileBuffer, bytes.Length + 1, 0); 
      } 

      iconIndex = 0; 
      flags = 1; // ISIOI_ICONFILE 
      return 0; // S_OK 
     } 


     public int GetPriority(out int priority) 
     { 
      priority = 0; // 0-100 (0 is highest priority) 
      return 0; // S_OK 
     } 
     #endregion 

     #region Registry 
     [ComRegisterFunction] 
     public static void Register(Type t) 
     { 
      RegistryKey rk = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\_" 
      + t.Name); 
      rk.SetValue(string.Empty, t.GUID.ToString("B").ToUpper()); 
      rk.Close(); 
      ShellInterop.SHChangeNotify(0x08000000, 0, IntPtr.Zero, IntPtr.Zero); 
     } 

     [ComUnregisterFunction] 
     public static void Unregister(Type t) 
     { 
      Registry.LocalMachine.DeleteSubKeyTree(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\_" 
      + t.Name); 
      ShellInterop.SHChangeNotify(0x08000000, 0, IntPtr.Zero, IntPtr.Zero); 
     } 
     #endregion 
    } 

誰でも私に説明できますか。私は、ユーザーが特別なフォルダの下に作成するファイルとフォルダのアイコンオーバーレイを実装する必要がある状況があります。 1)IShellIconOverlayIdentifierための相互運用署名にシェルによって使用されるインターフェース:

このコードは3つの主要部分を有する:

+0

コードのどの部分を理解していませんか? –

+0

私は知りたいのですが、このコードを使ってアイコンオーバーレイを実装するにはどうすればいいですか?つまり、特別なフォルダがあります。その特別なフォルダにファイルやフォルダを置くと、SVNのように各ファイル/フォルダにアイコンが適用されるはずです。この目的のために、このコードをどのように使用できますか? –

答えて

0

(ます。regasmに固定されます。regsvr32、私のミスのため申し訳ありませんが編集)

おかげアイコンオーバーレイを追加します。 2)MyOverlayは、そのインターフェイスの実装で、オーバーレイとして「normalIcon.ico」を追加しています(私は推測しています)。レジストリ内のシェル拡張としてMyOverlayを登録および登録解除する

3)(これは重要な部分である)コード。

私はアイコンオーバーレイの仕様とあまり慣れていないんだけど、あなたが登録メソッドを呼び出す必要があり、これを有効にしているようです。それは[ComRegisterFunction]が付いていますので、私は管理者権限でコマンドプロンプトから、あなたがしなければならないすべてを推測している、登録を呼び出す必要があり、コール

C:\> regasm <path to your DLL> 

です。同様にアンインストールする場合はregasm /u <path>となります。試してみる。

+0

@Anver - ありがとう。私はdllを登録しましたが、何も起こっていません。私はそれを登録するためにregasmを使用しました。私はregsvr32に行く必要がありますか? –

+0

私はregsvr32で登録しようとしました。 "D:\ Test \ IconOverLay_Test \ bin \ Release \ IconOverLay_Test.dll"というモジュールがロードされているが、エントリポイントDllRegisterServerが見つかりませんでした。 IconOverLay_Test \ IconOverLay_Test \ bin \ Release \ IconOverLay_Test.dllは有効なDLLまたはOCXファイルであり、再試行します。 " –

+1

あなたはそうです、regasmは正しいツールです、私の悪いです。 Registerメソッドに記載されているレジストリキーをチェックし、そこで正しいGUIDを確認することで、正しく登録されていることを確認できます。 今は動作しない理由はいくつでもあります。現在のところ、ホストプロセスは、DLLをロードしようとしているexplorer.exeです。 explorer.exeはすべての関連する依存関係を見つけることができますか? 異なるバージョンの.NET Frameworkを使用する別の管理対象シェル拡張が存在することはありますか? ProcessExplorerなどのツールを使用して、DLLがexplorer.exeにロードされていることを確認してから、デバッガを接続してみてください。 –

関連する問題