Невозможно привести объект COM типа «CommunicatorAPI.MessengerClass» к типу интерфейса «CommunicatorAPI.IMessengerAdvanced». - PullRequest
0 голосов
/ 01 сентября 2011

После нескольких руководств по коммуникатору API я застрял. В общем, все сводится к невозможности привести объект мессенджера в качестве интерфейса. Будь то мессенджер obj или messengererclass obj классы.

При попытке сотворить объект я получаю следующее исключение.

Невозможно привести объект COM типа «CommunicatorAPI.MessengerClass» к типу интерфейса «CommunicatorAPI.IMessengerAdvanced». Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID '{DA0635E8-09AF-480C-88B2-AA9FA1D9DB27}' завершился неудачно из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) .

Это пример кода, который я пытаюсь запустить, урезанный до того, что вызывает исключение.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CommunicatorAPI;

namespace OCA
{
    class OCA_main
    {
        static void Main(string[] args)
        {
            OCA m = new OCA();
            m.subscribe();
            m.startconvo("emailaddress");

        }
    }

    class OCA
    {
        MessengerClass msgr = new MessengerClass();
       // Messenger msgr = new Messenger(); //Tried this too... :(

        IMessengerAdvanced msgrAdv;


        public void subscribe()
        {
            msgr.OnIMWindowCreated += new DMessengerEvents_OnIMWindowCreatedEventHandler(msgr_OnIMWindowCreated);
        }

        public void unsubscribe()
        {
            msgr.OnIMWindowCreated -=new DMessengerEvents_OnIMWindowCreatedEventHandler(msgr_OnIMWindowCreated);
        }

        void msgr_OnIMWindowCreated(object pIMWindow)
        {
            try
            {

                IMessengerAdvanced msgrAdv = (IMessengerAdvanced)msgr;
            }
            catch (Exception ex)
            {
                Console.WriteLine("{0}", ex.Message);
            }

            throw new NotImplementedException();
            //... stuff
        }

        public void startconvo(string users)
        {
            try
            {

                IMessengerAdvanced msgrAdv = (IMessengerAdvanced)msgr;
            }
            catch (Exception ex)
            {
                Console.WriteLine("{0}", ex.Message);
            }
        }

    }
}

Я также пробовал приведенный выше код, используя "Messenger msgr = new Messenger ();" Без удачи.

Невозможно привести объект COM типа «CommunicatorAPI.MessengerClass» к типу интерфейса «CommunicatorAPI.IMessengerAdvanced». Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID '{DA0635E8-09AF-480C-88B2-AA9FA1D9DB27}' завершился неудачно из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) .

Я ужасно плохо знаком с c # и остановился на работе с коммуникатором API. Кстати, ссылки добавляются. Опция Embed ложна, и я в тупике. Интересно, нашел ли кто-нибудь решение.

Кроме того, я создал экземпляр интерфейса с таким эффектом: "msgAdv = msgr as IMessengerWndAdvanced;" без удачи Переменная msgAdv каждый раз равна нулю. Я пробовал разные примеры из M $, но безрезультатно. Более того, я прочитал файл справки «OCSDK.chm», который поставляется вместе с SDK. Нет упоминания об ошибке «Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)».

Помощь

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

В соответствии с этой страницей MSDN , Messenger влияет только на IMessenger3 и DMessengerEvents, поэтому вы не можете преобразовать свой объект Messenger в IMessengerAdvanced.

Если вам нужно использоватьIMessengerAdvanced, то вам нужно найти класс, который реализует этот интерфейс.В противном случае вы застряли с использованием методов интерфейса IMessenger3.

0 голосов
/ 01 сентября 2011

Во всех примерах я мог найти, что это было Messenger msgr = new Messenger(); НО еще более важно, что приведение к IMessengerAdvanced происходит только ПОСЛЕ msgr.AutoSign(), который успешно вызывается ... что является отличием от вашего кода.

Поскольку IMessengerAdvanced является лишь некоторым дополнением к IMessenger3 и его доступность зависит от конфигурации на стороне сервера, она может стать доступной только во время выполнения ПОСЛЕ того, как вы вошли в систему.

...