Servidor RTD no envía notificaciones de actualización a varias instancias de Excel

IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.

284883
Este artículo se ha archivado. Se ofrece "tal cual" y no se volverá a actualizar.
Síntomas
Cuando se utiliza varias instancias de Microsoft Office Excel junto con el servidor RealTimeData (RTD), puede recibir el mensaje siguiente:
El servidor de datos en tiempo real 'servername.classname' no responde. ¿Desea que Microsoft Excel intente reiniciar el servidor?
Por lo tanto, el servidor RTD es incapaz de enviar notificaciones de actualización a varias instancias de Excel.
Causa
Puede recibir este mensaje si el servidor RTD es un EXE de ActiveX se creó para MultiUse creación de instancias, que es un valor predeterminado para proyectos de EXE ActiveX en Visual Basic. Un EXE de ActiveX es MultiUse puede compartirse entre los clientes. Instancias independientes de Excel no pueden compartir servidores RTD. Cuando Excel inicia un servidor RTD, Excel llama al método ServerStart de servidor RTD y, a continuación, lo pasa una referencia al objeto CallBack para esa instancia de Excel. Por lo tanto, si dos instancias de Excel intentan compartir el mismo servidor RTD, la segunda instancia reemplaza el objeto CallBack para la primera instancia. Este comportamiento invalida el objeto CallBack para la primera instancia.
Solución
Utilice la creación de instancias SingleUse para componentes de ActiveX EXE que actuarán como servidores RTD para Excel. Al generar componentes ActiveX EXE como SingleUse, cada instancia de Excel tiene su propia instancia de la RTD servidor.

Otra solución es utilizar una DLL de ActiveX para el servidor RTD en lugar de un archivo EXE de ActiveX. Carga de DLL ActiveX en el mismo espacio de proceso que sus clientes y cada instancia de Excel siempre tiene su propia instancia del servidor RTD.
Más información

Pasos para reproducir el problema

  1. En Visual Basic, cree un EXE de ActiveX nuevo proyecto.
  2. En el menú proyecto , haga clic en referencias .
  3. Seleccione la Biblioteca de objetos de Microsoft Excel 2002 y, a continuación, haga clic en Aceptar .
  4. En el menú proyecto , haga clic en Propiedades de Project1 .
  5. Cambie el nombre del proyecto a "RTDExe" y, a continuación, haga clic en Aceptar .
  6. Cambie la propiedad nombre del módulo de clase Class1 a "Ejemplo".
  7. Agregue el código siguiente al módulo de clase.
    Option ExplicitImplements IRtdServer  'Interface allows Excel to contact this RealTimeData server.Dim nCounter As LongPrivate Function IRtdServer_ConnectData(ByVal TopicID As Long, Strings() As Variant, _   GetNewValues As Boolean) As Variant    IRtdServer_ConnectData = nCounterEnd FunctionPrivate Sub IRtdServer_DisconnectData(ByVal TopicID As Long)    nCounter = 0End SubPrivate Function IRtdServer_Heartbeat() As Long    'Do nothing.End FunctionPrivate 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 = aUpdatesEnd FunctionPrivate 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 FunctionPrivate Sub IRtdServer_ServerTerminate()    KillTimer 0, g_TimerIDEnd Sub					
  8. En el menú proyecto , seleccione Agregar módulo .
  9. Agregue el código siguiente al nuevo módulo.
    Public Declare Function SetTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long, _   ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPublic Declare Function KillTimer Lib "user32" (ByVal hWnd As Long, ByVal nIDEvent As Long) As LongPublic Const TIMER_INTERVAL = 5000Public oCallBack As Excel.IRTDUpdateEventPublic g_TimerID As LongPublic Sub TimerCallback(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, _   ByVal dwTime As Long)    oCallBack.UpdateNotifyEnd Sub					
  10. En el menú archivo , haga clic en Crear RTDExe.exe para crear el componente.
  11. En Excel, crear un nuevo libro.
  12. En la celda A1, escriba la fórmula siguiente:
    =RTD("RTDExe.Example",,"X")
    La función devuelve 0.
  13. Después de cinco segundos, el valor en incrementos de A1 para indicar que el servidor es notificar a Excel de las actualizaciones.
  14. Inicie otra instancia de Excel y, a continuación, agregue un nuevo libro.
  15. En la celda A1, escriba la fórmula siguiente:
    =RTD("RTDExe.Example",,"X")
    La función devuelve 0.
  16. El valor de A1 de la segunda instancia de Excel continuará actualizándose. Pero no el valor de A1 de la primera instancia. Tras el latido ha transcurrido el intervalo (15 segundos es el valor predeterminado), la primera instancia de Excel muestra el mensaje de error siguientes:
    El servidor de datos en tiempo real 'rtdexe.example' no responde. ¿Desea que Microsoft Excel intente reiniciar el servidor?
    Si hace clic en , se reiniciará el servidor y la primera instancia de Excel recibe actualización notificaciones desde el servidor. Sin embargo, después de reiniciar el servidor, la segunda instancia de Excel, a continuación, genera el mismo mensaje ha sido alcanza el intervalo de latidos.
Para corregir el problema, de modo que no reciban este error, cambie al proyecto en Visual Basic, cambie la propiedad Instancing de la clase example a SingleUse y, a continuación, reconstruya el servidor RTD.
Referencias
Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
285339Cómo crear un servidor RealTimeData para Excel
servidor rtd en tiempo real prb XL2002 XL2002 XL2003 XL2007 de rtdserver realtimedata tiempo real datos

Advertencia: este artículo se tradujo automáticamente

Propiedades

Id. de artículo: 284883 - Última revisión: 01/12/2015 17:24:05 - Revisión: 3.2

  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • kbnosurvey kbarchive kbmt kberrmsg kbpending kbprb KB284883 KbMtes
Comentarios