如何查找动态加载的com对象的成员

本文关键字:加载 com 对象 成员 动态 何查找 查找 | 更新日期: 2023-09-27 18:10:42

我试图使用一个OLE COM对象,我没有任何文档。我动态加载com对象:

dynamic comObj = Activator.CreateInstance(Type.GetTypeFromProgID("The Program ID"));

注册表中的程序ID指向一些exe(或者至少这是我认为的,我不能确定。有办法知道它到底指向哪里吗?我尝试在OLE COM查看器中加载exe,但我无法从中获得任何有用的信息。例如,我无法找到一个我确信存在的方法。实际上,加载comObject后,我能够调用这个方法没有任何问题,但我想知道是否有一种方法,我可以列出/查看这个COM对象的所有成员。

如何查找动态加载的com对象的成员

给定ProgID,您可以使用API函数和/或查找注册表(例如在HKEY_CLASSES_ROOT键下)COM服务器CLSID和承载类的二进制,包括可执行文件的完整路径。

如果您在那里有对类型库的引用,您还可以加载它并检查实现的接口和接口信息。你也可以从COM对象的实例中获得这些信息,只要它实现了像IDispatch, IDispatchEx, IProvideClassInfo这样的接口。

您可以通过IDispatch接口枚举所有的方法,如果它支持的话。

这是一篇使用IDispatch获取成员信息的MSDN文章

我不记得我在哪里复制了这个源代码。请作者原谅。

using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Runtime.InteropServices.CustomMarshalers;
namespace ConsoleApplication1
{
    [
       ComImport,
       Guid("00020400-0000-0000-C000-000000000046"),
       InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
    ]
    public interface IDispatch
    {
        void Reserved();
        [PreserveSig]
        int GetTypeInfo(uint nInfo, int lcid,
           [MarshalAs(
              UnmanagedType.CustomMarshaler,
              MarshalTypeRef = typeof(TypeToTypeInfoMarshaler))]
           out System.Type typeInfo);
    }
    class Program
    {
        static void Main(string[] args)
        {
            Type t1 = Type.GetTypeFromProgID("WbemScripting.SWbemDateTime");
            Object o1 = Activator.CreateInstance(t1);
            IDispatch disp2 = o1 as IDispatch;
            if (disp2 != null)
            {
                Type t3;
                disp2.GetTypeInfo(0, 0, out t3);
                MemberInfo[] mlist3 = t3.GetMembers();
            }
        }
    }
}

您可以在C:'WINDOWS'Microsoft.NET'Framework'v4.0.30319'

中找到custommarshalerers .dll