Entrar

Servidor RTD não envia notificações de atualizaçã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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

284883
Este artigo foi arquivado. É oferecido "como está" e não será mais atualizado.
Sintomas
Quando você usa várias instâncias do Microsoft Office Excel juntamente com o servidor RTD (RealTimeData), poderá receber a seguinte mensagem:
O servidor de dados em tempo real 'servername.classname' não está respondendo. Deseja que o Microsoft Excel tente reiniciar o servidor?
Portanto, o servidor RTD está não é possível enviar notificações de atualização para várias instâncias do Excel.
Causa
Você pode receber essa mensagem se o servidor RTD for um EXE ActiveX que é criado para MultiUse instanciação, que é uma configuração padrão para projetos EXE ActiveX no Visual Basic. Um EXE ActiveX que é MultiUse pode ser compartilhado entre clientes. Instâncias separadas do Excel não podem compartilhar servidores RTD. Quando o Excel inicia um servidor RTD, o Excel chama o método de servidor RTD ServerStart e, em seguida, passa-lo uma referência para o objeto de retorno de chamada para essa instância do Excel. Portanto, se duas instâncias do Excel tentarem compartilhar o mesmo servidor RTD, a segunda instância substitui o objeto de retorno de chamada para a primeira instância. Esse comportamento invalida o objeto de retorno de chamada para a primeira instância.
Resolução
Use SingleUse instanciação de componentes de EXE ActiveX que irão atuar como servidores RTD para o Excel. Quando você cria EXE ActiveX componentes como SingleUse, cada instância do Excel tem sua própria instância do RTD servidor.

Outra solução é usar uma DLL ActiveX para o servidor RTD em vez de um EXE ActiveX. Carregar DLLs do ActiveX no mesmo espaço de processo como seus clientes e cada instância do Excel sempre tem sua própria instância do servidor RTD.
Mais Informações

Etapas para reproduzir o problema

  1. No Visual Basic, crie um EXE ActiveX novo projeto.
  2. No menu Project , clique em referências .
  3. Selecione a Biblioteca de objetos do Microsoft Excel 2002 e, em seguida, clique em OK .
  4. No menu Project , clique em Propriedades de Projeto1 .
  5. Alterar o nome do projeto para "RTDExe" e, em seguida, clique em OK .
  6. Altere a propriedade nome do módulo de classe Class1 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 , selecione Add Module .
  9. Adicione o seguinte código para o novo 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. No menu arquivo , clique em Criar RTDExe.exe para criar o componente.
  11. No Excel, crie uma nova pasta de trabalho.
  12. Na célula A1, digite a seguinte fórmula:
    =RTD("RTDExe.Example",,"X")
    A função retornará 0.
  13. Após cinco segundos, o valor em incrementos de A1 para indicar que o servidor é notificar Excel de atualizações.
  14. Iniciar outra instância do Excel e, em seguida, adicione uma nova pasta de trabalho.
  15. Na célula A1, digite a seguinte fórmula:
    =RTD("RTDExe.Example",,"X")
    A função retornará 0.
  16. O valor A1 da segunda instância do Excel continua a atualizar. Mas não o valor A1 da primeira instância. Após a pulsação intervalo tiver decorrido (15 segundos é o padrão), a primeira instância do Excel exibe a seguinte mensagem de erro:
    O servidor de dados em tempo real 'rtdexe.example' não está respondendo. Deseja que o Microsoft Excel tente reiniciar o servidor?
    Se você clicar em Sim , o servidor for reiniciado, e a primeira instância do Excel recebe atualização notificações do servidor. No entanto, depois que você reiniciar o servidor, a segunda instância do Excel, em seguida, gera a mesma mensagem após o intervalo de pulsação ter sido atingido.
Para corrigir o problema para que você não receber esse erro, alterne para o projeto em 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 abaixo para ler o artigo na Base de dados de Conhecimento da Microsoft:
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
Comentários