我正在用 C# 编写一个应用程序,它通过 IDispatch 连接到一个 old-skool COM 对象。我用这种代码做到这一点:
public sealed class Attachments
{
Object comObject;
Type type;
private readonly static Attachments _instance = new Attachments();
public static Attachments Instance { get { return _instance; } }
private Attachments()
{
type = Type.GetTypeFromProgID("WinFax.Attachments");
if (type == null)
throw new ArgumentException("WinFax Pro is not installed.");
comObject = Activator.CreateInstance(type);
}
public Int16 Count()
{
Int16 x = (Int16) type.InvokeMember("Count",
BindingFlags.InvokeMethod,
null,
comObject,
null);
return x;
}
....
此 IDispatch 接口上的方法之一返回一个 LPDISPATCH,我认为它是一个指向 IDispatch 的长指针。它是另一个 COM 对象,ProgId WinFax.Attachment。(WinFax.Attachments 管理 WinFax.Attachment 对象的集合。)
在 C# 中,如何调用与该 LPDISPATCH 对应的 COM 对象上的方法?我可以做这样的事情:
Object o = type.InvokeMember("MethodReturnsLpdispatch",
BindingFlags.InvokeMethod,
null,
comObject,
null);
Type t2 = Type.GetTypeFromProgID("WinFax.Attachment"); // different ProgId !!
Object x = t2.InvokeMember("MethodOnSecondComObject",
BindingFlags.InvokeMethod,
null,
o,
null);