RTD 服务器不会将更新通知发送到多个 Excel 实例

文章翻译 文章翻译
文章编号: 284883 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

当您使用 Microsoft Office Excel 的多个实例一起 RealTimeData (RTD) 服务器时,您可能会收到以下消息:
实时数据服务器 'servername.classname 没有响应。要让 Microsoft Excel 来尝试重新启动服务器吗?
您的 RTD 服务器所以无法将更新通知发送给多个 Excel 实例。

原因

如果您 RTD 服务器是一个 ActiveX EXE MultiUse 实例存储,这是在 Visual Basic 中的 ActiveX EXE 项目的默认设置为生成的您可能会收到此消息。可以在客户端之间共享的是 MultiUse ActiveX EXE。单独的 Excel 实例不能共享 RTD 服务器。当 Excel 启动一个 RTD 服务器时,Excel 调用 RTD 服务器 ServerStart 方法,并将然后它传递 回叫 对象的引用的 Excel 实例的。因此,如果两个实例的 Excel 试图在共享相同的 RTD 服务器第二个实例将替换第一个实例的 回调 对象。此行为将使第一个实例的 回调 对象无效。

解决方案

使用 SingleUse 实例化 ActiveX EXE 组件将充当 Excel RTD 服务器。当 SingleUse 为您生成 ActiveX EXE 组件时,Excel 的每个实例都有自身实例在 RTD 服务器。

另一个解决方案是一个 ActiveX DLL 用于您 RTD 服务器而不是一个 ActiveX EXE。ActiveX dll 加载为它们的客户端在同一进程空间中,Excel 的每个实例始终都具有它自己的 RTD 服务器的实例。

更多信息

重现此问题的步骤

  1. 在 Visual Basic 中创建新的 ActiveX EXE 项目。
  2. 项目 菜单上单击 引用
  3. 选择 Microsoft Excel 2002 对象库,然后单击 确定
  4. 项目 菜单上单击 Project1 属性
  5. 将项目名称更改为"RTDExe",然后单击 确定
  6. 更改为"示例"的 Class1 的类模块的 名称 属性。
  7. 将下面的代码添加到类模块中。
    Option Explicit
    
    Implements IRtdServer  'Interface allows Excel to contact this RealTimeData server.
    
    Dim nCounter As Long
    
    Private Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, _
       GetNewValues As Boolean) As Variant
        IRtdServer_ConnectData = nCounter
    End Function
    
    Private Sub IRtdServer_DisconnectData(ByVal TopicID As Long)
        nCounter = 0
    End Sub
    
    Private Function IRtdServer_Heartbeat() As Long
        'Do nothing.
    End Function
    
    Private Function IRtdServer_RefreshData(TopicCount As Long) As Variant()
        Dim aUpdates(0 To 1, 0 To 0) As Variant
        nCounter = nCounter + 1
        aUpdates(0, 0) = 0   'For this sample, we only refresh topic id = 0
        aUpdates(1, 0) = nCounter
        TopicCount = 1
        IRtdServer_RefreshData = aUpdates
    End Function
    
    Private Function IRtdServer_ServerStart(ByVal CallbackObject As Excel.IRTDUpdateEvent) As Long
        nCounter = 0
        Set oCallBack = CallbackObject
        g_TimerID = SetTimer(0, 0, TIMER_INTERVAL, AddressOf TimerCallback)
        If g_TimerID > 0 Then IRtdServer_ServerStart = 1       'Any value <1 indicates failure.
    End Function
    
    Private Sub IRtdServer_ServerTerminate()
        KillTimer 0, g_TimerID
    End Sub
    					
  8. 项目 菜单上选择 添加模块
  9. 将下面的代码添加到新模块中。
    Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, _
       ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Public Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As Long
    
    Public Const TIMER_INTERVAL = 5000
    Public oCallBack As Excel.IRTDUpdateEvent
    Public g_TimerID As Long
    
    Public Sub TimerCallback(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, _
       ByVal dwTime As Long)
        oCallBack.UpdateNotify
    End Sub
    					
  10. 文件 菜单上单击 生成 RTDExe.exe 以生成组件。
  11. 在 Excel 中, 创建一个新的工作簿。
  12. 在单元格 A1 中键入以下公式:
    =RTD("RTDExe.Example",,"X")
    该函数将返回 0。
  13. 后五秒中 A1 为增量,以指示该服务器通知 Excel 的更新值。
  14. 启动 Excel 的其他实例,然后将添加一个新的工作簿。
  15. 在单元格 A1 中键入以下公式:
    =RTD("RTDExe.Example",,"X")
    该函数将返回 0。
  16. 在 A1 Excel 的第二个实例的值将继续更新。但在 A1 第一个实例的值不会。检测信号后已过去的时间间隔 (15 秒是默认设置),Excel 的第一个实例将显示以下错误消息:
    实时数据服务器 'rtdexe.example 没有响应。要让 Microsoft Excel 来尝试重新启动服务器吗?
    如果您单击 ,在服务器重新启动,并且 Excel 的第一个实例接收更新从该服务器的通知。然而,在重新启动在的服务器的 Excel 第二个实例后然后生成相同的消息后已达到检测信号间隔。
若要纠正此问题,以便您不会收到此错误,切换到项目中,Visual Basic、 示例 类的将 Instancing 属性更改为 SingleUse,然后重新生成 RTD 服务器。

参考

有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
285339如何为 Excel 创建 RealTimeData 服务器

属性

文章编号: 284883 - 最后修改: 2007年5月14日 - 修订: 3.2
这篇文章中的信息适用于:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 标准版
  • Microsoft Visual Basic 6.0 专业版
关键字:?
kbmt kberrmsg kbpending kbprb KB284883 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 284883
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com