更改GUID更改程序行为

时间:2013-07-15 03:42:17

标签: c#-4.0 com interop windows-shell

我目前正致力于创建命名空间扩展。 所以我想在Computer中创建一个条目,并让explorer.exe调用我的IShellFolder实现。 我让它工作了几分钟(我愚蠢地决定在提交之前清理代码),所以我就在附近。

但是我注意到一些非常奇怪的事情:更改类的GUID值会改变我在explorer.exe中看到的内容

我发现that question告诉我我没做坏事

以下是代码:

的AssemblyInfo.cs:

[assembly: ComVisible(false)]
[assembly: Guid("007C5100-4251-47BE-8141-D2AD3F496E6A")]

RootFolder.cs:

[ClassInterface(ClassInterfaceType.None)
[Guid("007C5101-4251-47BE-8141-D2AD3F496E6A"), ComVisible(true)]
public class RootFolder : IShellFolder, IShellFolder2, IPersistFolder, IPersistFolder2 {
    private const String _mountPoint = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{0}";
    private const String _mountName = "CLSID\\{0}";

    #region Shell Extension Registration
    [ComRegisterFunction()]
    public static void Register(Type t)
    {
        Console.WriteLine("Registering {0}...", t.GUID);
        try {
            if (t.GUID == null)
                throw new ArgumentException("CLSID must not be null");
            using (RegistryKey key = Registry.CurrentUser.CreateSubKey(String.Format(_mountPoint, t.GUID.ToString("B")))) {
                key.SetValue(null, "RootFolder");
            }
            using (RegistryKey key = Registry.ClassesRoot.OpenSubKey(String.Format(_mountName, t.GUID.ToString("B")), true)) {
                key.SetValue(null, "RootFolder");
                using (RegistryKey shFolder = key.CreateSubKey("ShellFolder")) {
                    shFolder.SetValue("Attributes", 0x78000040);
                    shFolder.SetValue("WantsFORPARSING", "");
                }
            }
            using (RegistryKey key = Registry.LocalMachine.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved")) {
                key.SetValue(t.GUID.ToString("B"), "RootFolder");
            }
            IntPtr pidl = NativeMethod.SHGetKnownFolderIDList(KnownFolder.ComputerFolder.clsid, 0, IntPtr.Zero);
            NativeMethod.SHChangeNotify(NativeMethod.FSNotification.UpdateDir, NativeMethod.ItemMeaning.IDList, pidl, IntPtr.Zero);
        } catch (Exception ex) {
            Logger.Write(Logger.Severity.Fatal, "Registration error: {0}", ex.Message);
            throw;  // Re-throw the exception
        }
    }

    [ComUnregisterFunction()]
    public static void Unregister(Type t)
    {
        try {
            if (t.GUID == null)
                throw new ArgumentException("CLSID must not be null");
            Registry.CurrentUser.DeleteSubKey(String.Format(_mountPoint, t.GUID.ToString("B")), false);
            using (RegistryKey k = Registry.ClassesRoot.OpenSubKey(String.Format(_mountName, t.GUID.ToString("B")), true)) {
                if (k != null)
                    k.DeleteSubKey("ShellFolder");
            }
            using (RegistryKey key = Registry.LocalMachine.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved")) {
                if (key != null)
                    key.DeleteValue(t.GUID.ToString("B"), false);
            }

            IntPtr pidl = NativeMethod.SHGetKnownFolderIDList(KnownFolder.ComputerFolder.clsid, 0, IntPtr.Zero);
            NativeMethod.SHChangeNotify(NativeMethod.FSNotification.UpdateDir, NativeMethod.ItemMeaning.IDList, pidl, IntPtr.Zero);
        } catch (Exception ex) {
            Logger.Write(Logger.Severity.Critical, "Registration error: {0}", ex.Message);
            throw;  // Re-throw the exception
        }
    }
    #endregion


    #region IShellFolder2 Inheritance
    [All the methods looks like that, this is just a test]
    public IEnumIDList EnumObjects(IntPtr hwndOwner, EnumObject flags)
    {
        Logger.Write("Tracing....");
        throw new NotImplementedException();
    }
    #endregion

    #region IPersistFolder2 Inheritance
    [Ditto]
    #endregion
}

我使用范围007C5 {100 ... 120} -4251-47BE-8141-D2AD3F496E6A作为我的GUID 当我的扩展程序有GUID 007C5101时,它只显示没有任何属性的“RootFolder”。 当它有007C5100(与程序集相同),或007C5102或007C5103时,它显示为“系统文件夹”(即使它没有调用我的DLL)。 我对这种行为感到有些困惑,世界上如何改变GUID导致这种变化?

注意:我在注册表中搜索了4251-47BE-8141-D2AD3F496E6A(我的GUID的不可变部分),并且在取消注册后找不到任何内容。

0 个答案:

没有答案