在关注多个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)”错误。
帮助?
答案 0 :(得分:1)
根据此MSDN page, Messenger仅支持IMessenger3 和DMessengerEvents,因此您无法将Messenger对象msgr转换为IMessengerAdvanced。
如果您需要使用IMessengerAdvanced,那么您需要找到一个实现该接口的类。否则,您将无法使用IMessenger3接口的方法。
答案 1 :(得分:0)
在所有示例中,我都会发现它是Messenger msgr = new Messenger();
但更重要的是,只有在成功调用IMessengerAdvanced
后才会发生msgr.AutoSign()
的转换...这与您的代码有所不同。
由于IMessengerAdvanced
只是IMessenger3
的一些补充,并且它的可用性取决于服务器端配置,因此只有在您登录后才能在运行时可用。