2010-08-19 85 views
2

使用regasm为COM interop注册程序集时,它所做的一件事就是创建一个HKEY_CLASSES_ROOT \ CLSID {000 ... 000}注册表项,其默认值为COM类的ProgId(请参阅MSDN文章Registering Assemblies with COM)。是否可以指定由regasm创建的ClassID注册表项的默认值?

是否可以指定regasm设置为默认值的字符串?即给它一个更有意义的名字?

例如:

HKEY_CLASSES_ROOT \ CLSID {000 ... 000} \默认值=

,而不是 “我真的有用的描述性名称”:

HKEY_CLASSES_ROOT \ CLSID {000 ... 000} \ Default =“An.Obscure.Prog.Id”

我想可以在regasm设置它们之后调整注册表值,但如果我可以说服regasm来设置它,那将更容易。

回答

1

我认为问题和答案都是错误的。这里涉及三个名称:

  1. ClassId或GUID,具有熟悉的格式,例如, “{F4754C9B-64F5-4B40-8AF4-679732AC0607}”
  2. ProgId或程序名称,应格式化为Vendor.Component.Version(请参阅http://msdn.microsoft.com/en-us/library/aa911706.aspx) - 例如“Word.Document.12”
  3. 人类可读的名称 - 这是通常显示在COM组件列表中的名称(如VS中的添加引用/ COM对话框或OLE应用程序中的插入 - >对象菜单),例如“Microsoft Word文档”

在注册表中的相应条目为:

CLASSES_ROOT\CLSID\ClassId @= "Human readable name" 
CLASSES_ROOT\CLSID\ClassId\ProgId @= "ProgId" 
CLASSES_ROOT\ProgId @= "Human readable name" 
CLASSES_ROOT\ProgId\CLSID @= "ClassId" 

看看你自己的注册表中的一些例子。

如果您反思regasm.exe,您会发现它始终使用Type.FullName作为人类可读的名称。这是一个痛苦的屁股,因为这意味着你必须使用com注册挂钩来设置HRN。例如,他们很容易查找DisplayName属性,然后使用它。无论如何,这是一个设置HRN条目的帮助函数。从您的注册挂钩调用它。

有关COM注册钩更多细节参见http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.comregisterfunctionattribute.aspx

public static void SetHumanReadableName(Type t, string humanReadableName) 
{ 
    var classKeyName = string.Format(@"CLSID\{{{0}}}", t.GUID); 
    var classKey = Registry.ClassesRoot.OpenSubKey(classKeyName, true); 
    if (classKey == null) 
     return; 
    classKey.SetValue(string.Empty, humanReadableName); 
    // if it has a progid set the HRN on the progid entry too 
    foreach (ProgIdAttribute progId in t.GetCustomAttributes(typeof(ProgIdAttribute), false)) 
    { 
     var progIdKey = Registry.ClassesRoot.OpenSubKey(progId.Value, true); 
     if (progIdKey != null) 
      progIdKey.SetValue(string.Empty, humanReadableName); 
    } 
} 
2
在你的类,它具有的RegisterClass()函数来注册本身为COM Interop有你需要添加

[ProgId("Descriptive name for my really useful class")] 
[Guid("000000-23FD-4F6F-8B50-0000000")] 
中的Guid

属性有GUID都到HKEY_CLASSES_ROOT \ CLSID几个Attrubutes

在ProgID中是你想要的有意义的名字。

实际上,它建议将ProgID作为名称空间+类名称,所以您最好将您的类(和)项目重命名为更有意义的名称。

相关问题