如何查找动态加载的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对象的所有成员。
给定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'