Как вы создаете экземпляр IDispatchEx в C #? - PullRequest
1 голос
/ 29 апреля 2011

это мой первый ТАК вопрос! Я хотел бы создать экземпляр COM-объекта и привести его к IDispatchEx, чтобы я мог перечислить его члены. Вот пример:

    Type _COMType = System.Type.GetTypeFromProgID("Scripting.FileSystemObject");
    var _COMObject = (IDispatchEx)Activator.CreateInstance(_COMType);

Мой IDispatchEx идентичен тому, который на этом сайте (не мой сайт), за исключением того, что GetNextDispID и GetMemberName возвращают int (который я хочу использовать для HRESULT, как описано на MSDN ).

Пример выше не работает. Есть ли способ создания экземпляров COM-объектов, как если бы вы использовали приведение Active Scripting к интерфейсу IDispatchEx?

Спасибо за любую помощь и предложения!

Ответы [ 2 ]

5 голосов
/ 30 апреля 2011

Эта операция завершилась неудачно, потому что QueryInterface вызов на COM компонент для интерфейса с IID '{A6EF9860-C720-11D0-9337-00A0C90DCAA9}' не удалось из-за следующей ошибки: Нет такой интерфейс поддерживается (исключение от HRESULT: 0x80004002 (E_NOINTERFACE)).

Сообщение об исключении, которое вы получаете, является ясным как звонок, Scripting.FileSystemObject просто не реализует интерфейс IDispatchEx. Только IDispatch. Это отлично работает:

        Type t = System.Type.GetTypeFromProgID("Scripting.FileSystemObject");
        var obj = Activator.CreateInstance(t);
        var iobj = (stdole.IDispatch)obj;

Вы закончили, вы не можете заставить COM-класс COM реализовать интерфейс. Я не ожидал бы, что очень многие COM-классы реализуют его, IDispatchEx довольно неясен. Подходит для формы JScript.

0 голосов
/ 29 апреля 2011

Похоже, вам нужно определить этот интерфейс самостоятельно, если вы хотите использовать его в C # ( source )

Эта тема может быть актуальной - похоже, что кто-то нашел использование существующей реализации IDispatchEx.

...