рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХреЗ рд▓рд┐рдП рд╢реИрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди

рд╡рд┐рдХрд╕рд┐рдд рдЙрддреНрдкрд╛рджреЛрдВ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдзрд┐рдХрддрдо рд╕реНрддрд░ рдХрд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдХреАрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдкреВрд░реА рдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛред рдпрд╣ рдЖрд▓реЗрдЦ рд╢реЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдФрд░ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╣рд▓реБрдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛, рдРрд╕реЗ рдШрдЯрдХ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╢реЗрд▓ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдореЗрдиреВ рд╕реВрдЪреА рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдореМрдЬреВрджрд╛ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рднреА рдХрд░реЗрдВред


рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рд╡рд┐рдВрдбреЛрдЬ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╢реЗрд▓ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдПрдкреНрд▓реЗрдЯ, рд╕реНрдХреНрд░реАрди рд╕реЗрд╡рд░, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдПрдХ рдУрдПрд╕ рдШрдЯрдХ рдЬреЛ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдерд╛, рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд░ рдХреЗ рдХрд╛рд░рдгред

рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдЖрдкрдХреЛ рд╡рд┐рд╢реЗрд╖ COM рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреБрдж рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рдПрдкреАрдЖрдИ рдореЗрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдРрд╕реА COM рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХрд┐рди рддрд░реАрдХреЛрдВ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред COM рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рдж рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ Windows рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрде рдкрд░ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд╡рд░реНрдгрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп Windows рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░, рдЗрд╕реА COM рдСрдмреНрдЬреЗрдХреНрдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХреЗред
рддреЛ, рд╣рдо рдПрдХ COM рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреА рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╣рдо .net рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХрд░реЗрдВрдЧреЗред

рд╣рдо рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЕрдкрдиреА рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ COM рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:
// Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from // COM, set the ComVisible attribute to true on that type. [assembly: ComVisible(true)] // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("345F4DC2-A9BF-11E2-AA47-CC986188709B")] 

рд╣рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдПрдкреАрдЖрдИ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  [DllImport("shell32")] internal static extern uint DragQueryFile(uint hDrop,uint iFile, StringBuilder buffer, int cch); [DllImport("user32")] internal static extern uint CreatePopupMenu(); [DllImport("user32")] internal static extern int InsertMenuItem(uint hmenu, uint uposition, uint uflags, ref MENUITEMINFO mii); [DllImport("user32.dll")] internal static extern bool SetMenuItemBitmaps(IntPtr hMenu, uint uPosition, uint uFlags, IntPtr hBitmapUnchecked, IntPtr hBitmapChecked); [DllImport("Shell32.dll")] internal static extern void SHChangeNotify(int wEventId, uint uFlags, IntPtr dwItem1, IntPtr dwItem2); const int SHCNE_ASSOCCHANGED = 0x08000000; [DllImport("user32.dll", SetLastError = true)] internal static extern bool PostMessage(IntPtr hWnd, [MarshalAs(UnmanagedType.U4)] uint Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", SetLastError = true)] internal static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

рдбреНрд░реИрдЧрд╡рд┐рдХрдлрд╛рдЗрд▓ рдлрд╝рдВрдХреНрд╢рди рд╣рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЪрдпрдирд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, SHChangeNotify рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╢реЗрд▓ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЪреВрдБрдХрд┐ рд╣рдо рдПрдХ COM рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ IShellExtInit рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдзрд┐ рдореЗрдВ, рд╣рдореЗрдВ рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

  [ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), GuidAttribute("000214e8-0000-0000-c000-000000000046")] public interface IShellExtInit { [PreserveSig()] int Initialize (IntPtr pidlFolder, IntPtr lpdobj, uint /*HKEY*/ hKeyProgID); } 

COM рдЗрдВрдЯрд░рдлрд╝реЗрд╕ IContextMenu рдХрд╛ рд╡рд░реНрдгрди рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╕рд╣реА рдХреЗ рдмрд░рд╛рдмрд░ рдкрд░рд┐рд░рдХреНрд╖рдг рдХрд╛ рдореВрд▓реНрдп рдорд╛рдирд╡ рд╕рдВрд╕рд╛рдзрди рдпрд╛ рдЦреБрджрд░рд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкреНрд░рдмрдВрдзрд┐рдд рд╣рд╕реНрддрд╛рдХреНрд╖рд░реЛрдВ рдХреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдкрд╛рдВрддрд░рдг рдХреА рд╢реБрд░реБрдЖрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдЪрдЖрд░рдИрдПрд╕рдЯреЗрд▓ рдпрд╛ рдЦреБрджрд░рд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╕рддреНрдп рд╣реИред
  [ComImport(), InterfaceType(ComInterfaceType.InterfaceIsIUnknown), GuidAttribute("000214e4-0000-0000-c000-000000000046")] public interface IContextMenu { // IContextMenu methods [PreserveSig()] int QueryContextMenu(uint hmenu, uint iMenu, int idCmdFirst, int idCmdLast, uint uFlags); [PreserveSig()] void InvokeCommand (IntPtr pici); [PreserveSig()] void GetCommandString(int idCmd, uint uFlags, int pwReserved, [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] byte[] pszName, uint cchMax); } 

QueryContextMenu рдкрджреНрдзрддрд┐ рдХреЛ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдореЗрдВ рд╣рдореЗрдВ рдореЗрдиреВ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, GetCommandString рдЗрд╕ рдЖрджреЗрд╢, рдЗрд╕рдХреЗ рд╡рд┐рд╡рд░рдг рдФрд░ рдЗрд╕реА рддрд░рд╣ рдХреЗ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред InvokeCommand рдореЗрдиреВ рдЖрдЗрдЯрдо рд╣реИ рдХрд┐ рд╣рдо рдЬреЛрдбрд╝ рджреЗрдЧрд╛ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

COM рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
 [System.Runtime.InteropServices.ComRegisterFunctionAttribute()] static void RegisterServer(System.Type type) { try { string approved = string.Empty; string contextMenu = string.Empty; RegistryKey root; RegistryKey rk; root = Registry.LocalMachine; rk = root.OpenSubKey(Resources.ApprovedReg, true); rk.SetValue(type.GUID.ToString("B"), Resources.Extension); approved = rk.ToString(); rk.Flush(); rk.Close(); root = Registry.ClassesRoot; rk = root.CreateSubKey(Resources.ExShellReg); rk.Flush(); rk.SetValue(null, type.GUID.ToString("B")); contextMenu = rk.ToString(); rk.Flush(); rk.Close(); EventLog.WriteEntry("Application", "Example ShellExt Registration Complete.\r\n" + approved + "\r\n" + contextMenu, EventLogEntryType.Information); RestartExplorer(); } catch(Exception e) { EventLog.WriteEntry("Application", "Example ShellExt Registration error.\r\n" + e.ToString(), EventLogEntryType.Error); } } 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдШрдЯрдХ рд╣реИ рдЬреЛ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИ, рд╣рдо ContextMenuHandlers рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ (* \\ shellex \\ ContextMenuHandlers \\ ExShell)ред рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рд╣рдо explorer.exe рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд░рд┐рд╡рд░реНрддрди рддреБрд░рдВрдд рдкреНрд░рднрд╛рд╡реА рд╣реЛрдВред
 [System.Runtime.InteropServices.ComUnregisterFunctionAttribute()] static void UnregisterServer(System.Type type) { try { string approved = string.Empty; string contextMenu = string.Empty; RegistryKey root; RegistryKey rk; // Remove ShellExtenstions registration root = Registry.LocalMachine; rk = root.OpenSubKey(Resources.ApprovedReg, true); approved = rk.ToString(); rk.DeleteValue(type.GUID.ToString("B")); rk.Close(); // Delete regkey root = Registry.ClassesRoot; contextMenu = Resources.ExShellReg; root.DeleteSubKey(Resources.ExShellReg); EventLog.WriteEntry("Application", "Example ShellExt Unregister Complete.\r\n" + approved + "\r\n" + contextMenu, EventLogEntryType.Information); Helpers.SHChangeNotify(0x08000000, 0, IntPtr.Zero, IntPtr.Zero); } catch(Exception e) { EventLog.WriteEntry("Application", "Example ShellExt Unregister error.\r\n" + e.ToString(), EventLogEntryType.Error); } } 

рдШрдЯрдХ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп, рд╣рдо рдкрд╣рд▓реЗ рдирд┐рд░реНрдорд┐рдд рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВред
рдЕрдЧрд▓рд╛, рд╣рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рд╣рдо IShellExtInit, IContextMenu рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдореИрдВ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдкреВрд░реЗ рдХреЛрдб рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред

  int IShellExtInit.Initialize (IntPtr pidlFolder, IntPtr lpdobj, uint hKeyProgID) { try { if (lpdobj != (IntPtr)0) { // Get info about the directory IDataObject dataObject = (IDataObject)Marshal.GetObjectForIUnknown(lpdobj); FORMATETC fmt = new FORMATETC(); fmt.cfFormat = CLIPFORMAT.CF_HDROP; fmt.ptd = 0; fmt.dwAspect = DVASPECT.DVASPECT_CONTENT; fmt.lindex = -1; fmt.tymed = TYMED.TYMED_HGLOBAL; STGMEDIUM medium = new STGMEDIUM(); dataObject.GetData(ref fmt, ref medium); m_hDrop = medium.hGlobal; } } catch(Exception) { } return 0; } 

рдШрдЯрдХ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрдВрдХреНрд╢рди рддрдм рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдЦреЛрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдиреВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд╡рд░реНрддрдорд╛рди рд╡рд╕реНрддреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IDataObject рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо hGlobal рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рд╣реИрдВрдбрд▓ рд╡рд░реНрддрдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╣рдЪрд╛рдирддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рд╣рдорд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╣реЛрддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛, рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдкреЙрдк рдЕрдк рд╣реЛрддрд╛ рд╣реИред

 int IContextMenu.QueryContextMenu(uint hMenu, uint iMenu, int idCmdFirst, int idCmdLast, uint uFlags) { if ( (uFlags & 0xf) == 0 || (uFlags & (uint)CMF.CMF_EXPLORE) != 0) { uint nselected = Helpers.DragQueryFile(m_hDrop, 0xffffffff, null, 0); if (nselected > 0) { for (uint i = 0; i < nselected; i++) { StringBuilder sb = new StringBuilder(1024); Helpers.DragQueryFile(m_hDrop, i, sb, sb.Capacity + 1); fileNames.Add(sb.ToString()); } } else return 0; 

рдХреЛрдб рдХреЗ рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕рд╣реА рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЪрдпрдирд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рднреА рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред рдореИрдВ рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрдм iFile = 0xffffff рдХреЛ DragQueryFile рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЧреБрдЬрд░ рд░рд╣рд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред

 // Add the popup to the context menu MENUITEMINFO mii = new MENUITEMINFO(); mii.cbSize = 48; mii.fMask = (uint) MIIM.ID | (uint)MIIM.TYPE | (uint) MIIM.STATE; mii.wID = idCmdFirst; mii.fType = (uint) MF.STRING; mii.dwTypeData = Resources.MenuItem; mii.fState = (uint) MF.ENABLED; Helpers.InsertMenuItem(hMenu, (uint)iMenu, (uint)MF.BYPOSITION | (uint)MF.STRING, ref mii); commands.Add(idCmdFirst); System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); Stream myStream = myAssembly.GetManifestResourceStream(Resources.BitmapName); Bitmap image = new Bitmap(myStream); Color backColor = image.GetPixel(1, 1); image.MakeTransparent(backColor); Helpers.SetMenuItemBitmaps((IntPtr)hMenu, (uint)iMenu, (uint)MF.BYPOSITION, image.GetHbitmap(), image.GetHbitmap()); // Add a separator MENUITEMINFO sep = new MENUITEMINFO(); sep.cbSize = 48; sep.fMask = (uint )MIIM.TYPE; sep.fType = (uint) MF.SEPARATOR; Helpers.InsertMenuItem(hMenu, iMenu + 1, 1, ref sep); } return 1; } 

рдпрд╣рд╛рдВ рд╣рдо InsertMenuItem рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рдирдпрд╛ рдореЗрдиреВ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдЗрд╕ рдореЗрдиреВ рдЖрдЗрдЯрдо рдореЗрдВ рдПрдХ рдЖрдЗрдХрди рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕реМрдВрджрд░реНрдп рд╕реМрдВрджрд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рднрд╛рдЬрди рд░реЗрдЦрд╛ рднреА рдмрдирд╛рддреЗ рд╣реИрдВред MENUITEMINFO рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣рдорд╛рд░реЗ рдореЗрдиреВ рдЖрдЗрдЯрдо, рдЕрд░реНрдерд╛рддреН рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ (ftype), рдбреЗрдЯрд╛ рд╕рдорд╛рд╣рд┐рдд (dwTypeData), рд╕реНрдерд┐рддрд┐ (fState), рдореЗрдиреВ рдЖрдЗрдЯрдо рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (wID) рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИред HMenu рд╡реИрд░рд┐рдПрдмрд▓ рд╡рд░реНрддрдорд╛рди рдбреНрд░реЙрдк-рдбрд╛рдЙрди рдореЗрдиреВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ, iMenu рд╡рд╣ рд╕реНрдерд┐рддрд┐ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рд╕рдВрдкреВрд░реНрдг рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк MSDN рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛, GetCommandString рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
  void IContextMenu.GetCommandString(int idCmd, uint uFlags, int pwReserved, byte[] pszName, uint cchMax) { string commandString = String.Empty; switch(uFlags) { case (uint)GCS.VERB: commandString = "test"; break; case (uint)GCS.HELPTEXTW: commandString = "test"; break; } var buf = Encoding.Unicode.GetBytes(commandString); int cch = Math.Min(buf.Length, pszName.Length - 1); if (cch > 0) { Array.Copy(buf, 0, pszName, 0, cch); } else { // null terminate the buffer pszName[0] = 0; } } 

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрдорд╛рдВрдб рдХрд╛ рдПрдХ рднрд╛рд╖рд╛-рд╕реНрд╡рддрдВрддреНрд░ рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрдХреЗрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрд░рдорд╢рдГ рд╣реЗрд▓реНрдкрдЯреЗрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрддрд╛ рд╣реИред

рдЦреИрд░, рд╣рдорд╛рд░реЗ рдореЗрдиреВ рдЖрдЗрдЯрдо рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛:
  void IContextMenu.InvokeCommand (IntPtr pici) { try { System.Windows.Forms.MessageBox.Show("Test code"); } catch(Exception exe) { EventLog.WriteEntry("Application", exe.ToString()); } } 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред

рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реА COM рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ explorer.exe рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдШрдЯрдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ рдмреИрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо RegAsm.exe рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ COM рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ .net рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╡рд╣ COM рдерд╛, рд╕рд╛рде рд╣реА GACUtil рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ GAC рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдПред рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдмрд╛рдж, рдкреНрд░рдХреНрд░рд┐рдпрд╛ explorer.exe рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧреАред
рдореИрдВ рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рд╕рднреА рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВред рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ ShellExView рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдк рдЗрд╕реЗ Nirsoft рдирд┐рд░реНрдорд╛рддрд╛ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдпрд╛ рд▓реЗрдЦ рдореЗрдВ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рд╣рдорд╛рд░рд╛ рдШрдЯрдХ ShellExView рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


рд╕рдВрджрд░реНрдн рдореЗрдиреВ рдЦреБрд▓рд╛ рд╣реЛрдиреЗ рдкрд░ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗрд╡рд▓ рдЙрд╕ рдЪреАрдЬ рд╕реЗ рджреВрд░ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬреЛ рд╣рдо рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХ рдХреИрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рд╕рдордЭ рдХреЗ рд╕рд╛рде, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдореБрджрд╛рдп рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреНрдпрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рд╛рд░реНрдкрд╢реЗрд▓ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдХрд╛рдлреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ , рд╕рд╛рде рд╣реА рдХреЛрдбрдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ .NET рд╢реИрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓реЗрдЦ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЖрдк Windows рд╢реЗрд▓ рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдпрд╛ ATL + C ++ рдорд┐рдиреА рд╢реЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдлреНрд░реЗрдорд╡рд░реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдирд╛рд▓реЙрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдРрд╕реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ Microsoft рдХреА рдЪреЗрддрд╛рд╡рдиреА рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реВрдВрдЧрд╛: ".NET рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╢реЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ CLR рд░рдирдЯрд╛рдЗрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, CLR рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЛ рд╢реЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрдШрд░реНрд╖ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ред рдиреЗрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ 4 .рдиреЗрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ 2.0, 3.0, 3.5 рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрдб-рдмрд╛рдп-рд╕рд╛рдЗрдб рддрдХрдиреАрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкреБрд░рд╛рдиреЗ рд╕реАрдПрд▓рдЖрд░ 2 рдФрд░ рдирдП рд╕реАрдПрд▓рдЖрд░ 4 рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред "
рд╢реЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп .net рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕реАрдорд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдкрдврд╝реЗрдВ: рдЗрди-рдкреНрд░реЛрд╕реЗрд╕ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рд░реНрдЧрджрд░реНрд╢рди

рдПрдХ рдФрд░ рдирдЬрд╝рд░:
рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдХреЙрд▓рдо рд╣реИрдВрдбрд▓рд░ рд╢реЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди C # рдореЗрдВ
рд╢реЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВрдбрд▓рд░ рдмрдирд╛рдирд╛


рд╕реНрд░реЛрдд рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ: ExampleShell.rar

PS рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╡рд┐рдВрдбреЛрдЬ 8 рдкрд░ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╕рдореАрдХреНрд╖рд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ HKEY_CLASSES_ROOT \ CLSID \ {рдЧрд╛рдЗрдб рдШрдЯрдХ} / InprocServer32 рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдирд┐рдореНрди рдереНрд░реЗрдбрд┐рдВрдЧрдореЙрдбрд▓ = рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/In177469/


All Articles