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

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.

284883
Este artigo foi arquivado. Este artigo é oferecido "tal como está" e deixará de ser actualizado.
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 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. 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 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. 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
rtdserver realtimedata tempo real dados servidor rtd em tempo real prb XL2002 XL2002 XL2003 XL2007

Aviso: Este artigo foi traduzido automaticamente

Propriedades

ID do Artigo: 284883 - Última Revisão: 01/12/2015 17:24:11 - Revisão: 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 KbMtpt
Esta informação foi útil?