Servidor RTD não envia notificações de actualização para várias instâncias do Excel

Traduções de Artigos Traduções de Artigos
Artigo: 284883 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Quando utilizar várias instâncias do Microsoft Office Excel em conjunto com o servidor RealTimeData (RTD), poderá receber a seguinte mensagem:
O servidor de dados em tempo real 'servername.classname' não está a responder. Deseja que o Microsoft Excel tente reiniciar o servidor?
Por conseguinte, o servidor RTD é não é possível enviar notificações de actualização para múltiplas instâncias do Excel.

Causa

Poderá receber esta mensagem se o servidor RTD for um EXE ActiveX que é criado para MultiUse instâncias, que é uma predefinição para projectos EXE ActiveX no Visual Basic. Um EXE de ActiveX é MultiUse podem ser partilhado entre os clientes. Instâncias separadas do Excel não podem partilhar RTD servidores. Quando o Excel é iniciado um servidor RTD, o Excel chama o método de servidor RTD ServerStart e, em seguida, passa uma referência para o objecto de chamada de retorno para essa instância do Excel. Por conseguinte, se duas instâncias do Excel tentarem partilhar o mesmo servidor RTD, a segunda ocorrência substitui o objecto de chamada de retorno para a primeira ocorrência. Este comportamento invalida o objecto de chamada de retorno para a primeira ocorrência.

Resolução

Utilize SingleUse instâncias para componentes ActiveX EXE que irão agir RTD servidores para o Excel. Quando criar EXE ActiveX componentes como SingleUse, cada instância do Excel tem uma ocorrência da função RTD servidor.

Outra solução é utilizar uma DLL de ActiveX para o servidor RTD em vez de um EXE ActiveX. ActiveX DLL carregados no mesmo espaço de processo que os respectivos clientes e cada instância do Excel tem sempre uma ocorrência do servidor RTD.

Mais Informação

Passos para reproduzir o problema

  1. No Visual Basic, crie um EXE ActiveX novo projecto.
  2. No menu projecto , clique em References .
  3. Seleccione a Biblioteca de objectos Microsoft Excel 2002 e, em seguida, clique em OK .
  4. No menu projecto , clique em Propriedades do projeto1 .
  5. Alterar o nome do projecto para "RTDExe" e, em seguida, clique em OK .
  6. Altere a propriedade nome do módulo de classe Aula1 para "Exemplo".
  7. Adicione o seguinte código ao módulo de classe.
    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. No menu Project , seleccione Add Module .
  9. Adicione o seguinte código ao módulo novo.
    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. No menu ficheiro , clique em Criar RTDExe.exe para criar o componente.
  11. No Excel, crie um novo livro.
  12. Na célula A1, escreva a seguinte fórmula:
    =RTD("RTDExe.Example",,"X")
    A função devolve 0.
  13. Depois de cinco segundos, o valor em incrementos de A1 para indicar que o servidor é notificar Excel de actualizações.
  14. Iniciar outra instância do Excel e, em seguida, adicione um novo livro.
  15. Na célula A1, escreva a seguinte fórmula:
    =RTD("RTDExe.Example",,"X")
    A função devolve 0.
  16. O valor de A1 da segunda instância do Excel continua a actualizar. Mas não o valor de A1 da primeira instância. Depois do heartbeat tiver decorrido o intervalo (15 segundos é a predefinição), a primeira ocorrência do Excel apresenta a seguinte mensagem de erro:
    O servidor de dados em tempo real 'rtdexe.example' não está a responder. Deseja que o Microsoft Excel tente reiniciar o servidor?
    Se clicar em Sim , o servidor reinicia e a primeira ocorrência do Excel recebe actualização notificações do servidor. No entanto, depois de reiniciar o servidor, a segunda instância do Excel, em seguida, gera a mesma mensagem depois do intervalo de heartbeat.
Para corrigir o problema para que não a receber este erro, mude para o projecto no Visual Basic, altere a propriedade Instancing da classe de exemplo para SingleUse e, em seguida, recriar o servidor RTD.

Referências

Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
285339Como criar um servidor RealTimeData para Excel

Propriedades

Artigo: 284883 - Última revisão: 14 de maio de 2007 - Revisão: 3.2
A informação contida neste artigo aplica-se a:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Visual Basic 6.0 Professional Edition
Palavras-chave: 
kbmt kberrmsg kbpending kbprb KB284883 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 284883

Submeter comentários

 

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