COM взаимодействие: Как я могу получить CCW от LPDISPATCH? - PullRequest
0 голосов
/ 03 февраля 2011

Я пишу приложение на C #, которое подключается к COM-объекту old-skool через IDispatch. Я делаю это с помощью такого кода:

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 #, как вызвать методы для COM-объекта, соответствующего этому LPDISPATCH? Могу ли я просто сделать что-то вроде этого:

    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);

1 Ответ

0 голосов
/ 03 февраля 2011

да, это работает:

    Type type = Type.GetTypeFromProgID("WinFax.Attachments");
    if (type == null)
          throw new ArgumentException("WinFax Pro is not installed.");
    Object comObject = Activator.CreateInstance(type);  
    Object o2 = type.InvokeMember("MethodReturnsLpdispatch",
                                     BindingFlags.InvokeMethod,
                                     null,
                                     comObject,
                                     null);
    Type t2 = Type.GetTypeFromProgID("WinFax.Attachment"); // different ProgId !!
    Object x = t2.InvokeMember("MethodOnSecondComObject",  
                                     BindingFlags.InvokeMethod,
                                     null,
                                     o2,
                                     null);
...