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

时间:2011-10-05 18:10:11

标签: c# visual-studio-2010 com registry ole

我正在尝试使用我没有任何文档的OLE COM对象。我通过以下方式动态加载com对象:

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

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

3 个答案:

答案 0 :(得分:0)

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

Here is an MSDN article that uses IDispatch to get member info

答案 1 :(得分:0)

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

如果您在那里引用了类型库,您也可以加载它并检查已实现的接口和接口信息。您也可以从COM对象的实例获取此信息,前提是它实现了IDispatchIDispatchExIProvideClassInfo等接口。

答案 2 :(得分:0)

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

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 \

中找到CustomMarshalers.dll