1

我在使用 Lync2013 Client SDK 时遇到了一些麻烦。这是一件小事,但在我看来,它应该可以正常工作。

我正在创建一个应用程序,它使用 ExtensibilityWindow 显示调用者的一些数据。在应用程序启动时,我注册应用程序等并在接受的呼叫时,程序在 ConversationWindow 上调用 BeginOpenExtensibilityWindow。这在几乎所有情况下都可以正常工作。但是,正如我现在所知道的那样,有一个特定情况下这不起作用:当一个新的传入 AV 呼叫出现时,同时有一个活动的(onHold 与否无关紧要)传入呼叫。

(所以来电者 A 打电话给我,我接听电话时,来电者 B 打电话给我。然后函数 BeginOpenExtensibilityWindow 什么都不做)

如果其中一个是出站的,则没有问题,但是当两个都是入站时,对 BeginOpenExtensibilityWindow 的调用会通过而无需执行任何操作。EndOpenExtensibilityWindow 不会引发任何错误,它只是通过了。

为了找出问题所在,我尝试了以下方法:

  • 没有缓存检索到的 ConversationWindow:每次我需要它时,我都会调用 Automation.GetConversationWindow(conversation)

  • BeginOpenExtensibilityWindow 延迟调用:启动后台线程,连接后等待 5 秒再调用。

  • 在 BeginOpenExtensibilityWindow 之前调用 CloseExtensibilityWindow

我发现的是:在 BeginOpenExtensibilityWindow 之前调用 CloseExtensibilityWindow 时,第一次对话会引发错误。然而,第二个不会,而是调用 CloseExtensibilityWindow 关闭第一个对话的可扩展性窗口!!!我绝对 100% 确定我正在通过调用automation.GetConversationWindow(_conversation) 来检索对第二个窗口的引用,而“_conversation”是第二个调用!

所以可以肯定的是,我记录了对窗口的每次调用,如下所示:

 internal ConversationWindow ConversationWindow
    {
        get
        {
            _window = _automation.GetConversationWindow(_conversation);
            debugA.Add(string.Format("ConvId: {0}, WinHandle: {1}", _conversation.Properties[Microsoft.Lync.Model.Conversation.ConversationProperty.Id], _window.Handle));
            return _window;
        }
}

debugA 是一个静态列表,

当然,唉...,conversationId一直是空的(问题的根源??)所以我把它切换到_conversation.GetHashCode(),那么debugA的内容是:

转换:21950498,WinHandle:1902160

……还有一些……

转换:13391695,WinHandle:1902160

……还有一些……

显然,自动化正在为不同的对话返回相同的句柄!同样,这仅适用于两个传入的 AV 呼叫,IM 工作正常,没有混淆参考。

在我看来,这就像一个错误......但我不是专家......

任何帮助,非常感谢!

4

1 回答 1

0

忘了说,这是一个错误,Microsoft 修复了它:2015 年 9 月 8 日 Lync 2013 (Skype for Business) 的安全更新 (KB3085500)

于 2016-03-09T12:21:36.477 回答