【问题标题】:Unable to cast COM object of type 'CommunicatorAPI.MessengerClass' to interface type 'CommunicatorAPI.IMessengerAdvanced'无法将“CommunicatorAPI.MessengerClass”类型的 COM 对象转换为接口类型“CommunicatorAPI.IMessengerAdvanced”
【发布时间】:2011-09-01 07:35:55
【问题描述】:

在遵循多个 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 每次都为空。我尝试了 M$ 的不同示例,但无济于事。此外,我已通读 SDK 附带的“OCSDK.chm”帮助文件。没有提及“HRESULT 异常:0x80004002 (E_NOINTERFACE)”错误。

帮助?

【问题讨论】:

    标签: c# office-communicator


    【解决方案1】:

    根据MSDN pageMessenger 仅实现 IMessenger3 和 DMessengerEvents,因此您无法将 Messenger 对象 msgr 转换为 IMessengerAdvanced。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 在所有尝试中,我都已登录。因此,不需要 msgr.SignIn(b​​lah blah) 或 msgr.AutoSignIn()。实际上,再次这样做会挂起通讯器。不过谢谢! :)
      • 哦,我已经尝试了 MessengerClass msgr = new MessengerClass();因为 Messenger msgr = new Messenger() 抛出了类似的异常。我相信在msdn.microsoft.com/en-us/library/bb787245(v=office.12).aspx 的底部有人建议 MessengerClass 是正确的类。
      • 这意味着您的服务器配置方式不提供必要的接口...不是您的代码,而是导致IMessengerAdvanced不可用的服务器配置我认为
      猜你喜欢
      • 1970-01-01
      • 2018-06-20
      • 2018-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-24
      • 2010-12-02
      • 2012-12-13
      相关资源
      最近更新 更多