2012-02-15 6 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 
    } 

아무에게 나 설명 할 수 있으면 제발. 상황에 따라 사용자가 특수 폴더 아래에 만드는 파일과 폴더의 아이콘 오버레이를 구현해야합니다.

감사

+0

코드의 어떤 부분을 이해하지 못합니까? –

+0

방금 ​​아이콘 오버레이를 구현하는 데이 코드를 어떻게 사용할 수 있습니까? 내 말은, 나는 특별한 폴더가 있고, 그 특별한 폴더에 파일이나 폴더를 넣으면 SVN과 같이 각 파일/폴더에 아이콘이 적용되어야한다. 이를 위해이 코드를 어떻게 사용할 수 있습니까? –

답변

0

(편집 : 고정에 regsvr32가 RegAsm을 위해, 내 실수 죄송합니다)

이 코드는 세 가지 주요 부분이 있습니다 1) IShellIconOverlayIdentifier에 대한 상호 운용성 서명에 쉘에 의해 사용되는 인터페이스를 아이콘 오버레이를 추가하십시오. 2) MyOverlay는 해당 인터페이스의 구현으로 "normalIcon.ico"를 오버레이로 추가합니다 (추측하고 있습니다).

3) MyOverlay를 레지스트리의 셸 확장으로 등록하고 등록을 취소하는 코드입니다 (이 부분이 중요합니다).

아이콘 오버레이의 특성에 익숙하지 않지만이 기능을 사용하려면 Register 메서드를 호출해야합니다. 그것이 [ComRegisterFunction]로 표시된 이후로, 나는 당신이해야 할 모든 추측하고있어, 관리자 권한으로 명령 프롬프트에서 회원 가입을 호출해야

C:\> regasm <path to your DLL> 

를 호출합니다. 마찬가지로 regasm /u <path>을 제거하십시오. 시도 해봐.

+0

@Anver - 감사합니다. 나는 dll을 등록했지만 아무 일도 일어나지 않는다. 나는 그것을 등록하기 위해 regasm을 사용했다. regsvr32에 갈까요? –

+0

나는 그것을 regsvr32에 등록하려고 시도했다. "D : \ Test \ IconOverLay_Test \ IconOverLay_Test \ bin \ Release \ IconOverLay_Test.dll"모듈을로드했지만 진입 점 DllRegisterServer를 찾을 수 없습니다. "D : \ Test \ 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에로드되었는지 확인하고 디버거를 연결해야합니다. –