我正在尝试使用我没有任何文档的OLE COM对象。我通过以下方式动态加载com对象:
dynamic comObj = Activator.CreateInstance(Type.GetTypeFromProgID("The Program ID"));
注册表中的程序ID指向一些exe(或者至少这是我认为的,我无法确定。有没有办法知道它指向的确切位置)。我尝试在OLE COM查看器中加载exe,但我无法从中获取任何有用的信息。例如,我无法找到一种我确定知道的方法。实际上,在加载comObject之后我可以毫无问题地调用这个方法,但我想知道是否有一种方法可以列出/查看这个COM对象的所有成员。
答案 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对象的实例获取此信息,前提是它实现了IDispatch
,IDispatchEx
,IProvideClassInfo
等接口。
答案 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