使用ComTypes.ITypeInfo.CreateInstance对象的信息来公开coclass

时间:2015-10-02 20:32:16

标签: c# .net com

我正在使用C#(.NET)应用程序中的一些非托管类型库和引用文件来从中获取信息,例如它们包含的接口,函数,枚举等。我目前有一个ComTypes.ITypeInfo类型的对象,它代表一个coclass。我已经编写了一些代码来获取coclass的名称,但我真正想要的是该coclass中包含的所有接口名称的列表。我找不到任何容易访问的" System.Runtime.InteropServices.ComTypes命名空间中的属性,为了达到这个目的,我目前正在使用ITypeInfo.CreateInstance。根据我的理解,通过这样做,我可以得到一个Object类型的COM对象,然后从中获取所需的信息(我是COM的初学者,所以请随时指出我不正确的地方)。 / p>

我可以一直到达我已经成功地在一个coclass上进行调用的地方,然后找到了一个类型为" object {System .__ ComObject}"的对象,但是我'我不知道从哪里去。如何使用此coclass COM对象获取其包含的接口的名称?这是我用来获取coclass COM对象的代码:

//Assume the ti object below is already initialized as an object of TYPEKIND.TKIND_COCLASS
ComTypes.ITypeInfo ti;
if(//Condition where we know ti is a coclass)
{
   try
   {
      int href;
      Object obj;
      for (var i = 0; i < tiTypeAttr.cImplTypes; i++)
      {
         ti.GetRefTypeOfImplType(i, out href);
         ComTypes.ITypeInfo newTi;
         ti.GetRefTypeInfo(href, out newTi);
         if (newTi != null)
         {
            IntPtr attrP;
            ComTypes.TYPEATTR attr;
            newTi.GetTypeAttr(out attrP);
            attr = (ComTypes.TYPEATTR)Marshal.PtrToStructure(attrP, typeof(ComTypes.TYPEATTR));
            if (attr.typekind == ComTypes.TYPEKIND.TKIND_INTERFACE || attr.typekind == ComTypes.TYPEKIND.TKIND_DISPATCH)
            {
               Guid iid = attr.guid;
               ti.CreateInstance(null, iid, out obj);
               //STUCK HERE: Do stuff with obj to acquire the interface names within it
               newTi.ReleaseTypeAttr(attrP);
            }
         }
      }
   }
   catch(Exception e)
   {Console.WriteLine(e);}
}

有没有办法使用Object obj来获取我正在寻找的信息?或者有一种更简单的方法/方式吗?谢谢!

0 个答案:

没有答案