无法将“CommunicatorAPI.MessengerClass”类型的COM对象强制转换为接口类型“CommunicatorAPI.IMessengerAdvanced”

时间:2011-08-31 21:31:45

标签: c# office-communicator

在关注多个communicatorAPI指南之后,我似乎陷入困境。一般来说,它归结为无法将信使对象转换为接口。无论是messenger obj还是messengerclass obj类。

在尝试投射对象时,我收到以下异常。

  

无法将“CommunicatorAPI.MessengerClass”类型的COM对象强制转换为接口类型“CommunicatorAPI.IMessengerAdvanced”。此操作失败,因为对于具有IID“{DA0635E8-09AF-480C-88B2-AA9FA1D9DB27}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(来自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();”尝试了上面的代码。没有运气。

  

无法将“CommunicatorAPI.MessengerClass”类型的COM对象强制转换为接口类型“CommunicatorAPI.IMessengerAdvanced”。此操作失败,因为对于具有IID“{DA0635E8-09AF-480C-88B2-AA9FA1D9DB27}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(来自HRESULT的异常:0x80004002(E_NOINTERFACE))

我对c#非常陌生,而且我在使用communicatorAPI时已经站了起来。顺便说一句,参考文献被添加。嵌入选项是假的,我很难过。不知道有没有人找到解决方案。

此外,我已经实例化了界面,其中包含以下内容:“msgAdv = msgr as IMessengerWndAdvanced;” 没有运气。变量msgAdv每次都为null。我尝试了M $的不同例子,但无济于事。此外,我已阅读SDK附带的“OCSDK.chm”帮助文件。没有提到“HRESULT异常:0x80004002(E_NOINTERFACE)”错误。

帮助?

2 个答案:

答案 0 :(得分:1)

根据此MSDN page Messenger仅支持IMessenger3 和DMessengerEvents,因此您无法将Messenger对象msgr转换为IMessengerAdvanced。

如果您需要使用IMessengerAdvanced,那么您需要找到一个实现该接口的类。否则,您将无法使用IMessenger3接口的方法。

答案 1 :(得分:0)

在所有示例中,我都会发现它是Messenger msgr = new Messenger();但更重要的是,只有在成功调用IMessengerAdvanced后才会发生msgr.AutoSign()的转换...这与您的代码有所不同。

由于IMessengerAdvanced只是IMessenger3的一些补充,并且它的可用性取决于服务器端配置,因此只有在您登录后才能在运行时可用。