Sobre o intercâmbio dinâmico de dados

O Windows fornece vários métodos para transferir dados entre aplicativos. Um método é usar o protocolo DDE (Dynamic Data Exchange). O protocolo DDE é um conjunto de mensagens e diretrizes. Ele envia mensagens entre aplicativos que compartilham dados e usa memória compartilhada para trocar dados entre aplicativos. Os aplicativos podem usar o protocolo DDE para transferências de dados únicas e para trocas contínuas nas quais os aplicativos enviam atualizações uns aos outros à medida que novos dados se tornam disponíveis.

O Windows também oferece suporte à DDEML (Biblioteca de Gerenciamento de Intercâmbio de Dados Dinâmicos). O DDEML é uma biblioteca de vínculo dinâmico (DLL) que os aplicativos podem usar para compartilhar dados. O DDEML fornece funções e mensagens que simplificam a tarefa de adicionar o recurso DDE a um aplicativo. Em vez de enviar, postar e processar mensagens DDE diretamente, um aplicativo usa as funções DDEML para gerenciar conversas DDE. (Uma conversa DDE é a interação entre aplicativos cliente e servidor.)

O DDEML também fornece um recurso para gerenciar as cadeias de caracteres e os dados que os aplicativos DDE compartilham. Em vez de usar átomos e ponteiros para objetos de memória compartilhada, os aplicativos DDE criam e trocam identificadores de cadeia de caracteres, que identificam cadeias de caracteres, e identificadores de dados, que identificam objetos de memória. O DDEML também possibilita que um aplicativo de servidor registre os nomes de serviço que ele suporta. Os nomes são transmitidos para outros aplicativos no sistema, que podem usar os nomes para se conectar ao servidor. Além disso, o DDEML garante a compatibilidade entre aplicativos DDE, forçando-os a implementar o protocolo DDE de maneira consistente.

Os aplicativos existentes que usam o protocolo DDE baseado em mensagem são totalmente compatíveis com aqueles que usam o DDEML. Ou seja, um aplicativo que usa DDE baseado em mensagem pode estabelecer conversas e realizar transações com aplicativos que usam o DDEML. Devido às muitas vantagens do DDEML, novos aplicativos devem usá-lo em vez das mensagens DDE. Para usar os elementos de API do DDEML, você deve incluir o arquivo de cabeçalho DDEML em seus arquivos de origem, vincular com a biblioteca DDEML e garantir que a biblioteca de vínculo dinâmico DDEML esteja no caminho de pesquisa do sistema.

Os tópicos a seguir são discutidos nesta seção.

Protocolo de Troca Dinâmica de Dados

Como o Windows tem uma arquitetura baseada em mensagens, passar mensagens é o método mais apropriado para transferir informações automaticamente entre aplicativos. No entanto, as mensagens contêm apenas dois parâmetros (wParam e lParam) para passar dados. Como resultado, esses parâmetros devem se referir indiretamente a outros dados quando mais do que algumas palavras de informação passam entre aplicativos. O protocolo DDE define exatamente como os aplicativos devem usar os parâmetros wParam e lParam para passar pedaços maiores de dados por meio de átomos globais e identificadores de memória compartilhada. O protocolo DDE tem regras específicas para alocar e excluir átomos globais e objetos de memória compartilhada.

Um átomo global é uma referência a uma cadeia de caracteres. No protocolo DDE, os átomos identificam os aplicativos que trocam dados, a natureza dos dados que estão sendo trocados e os próprios itens de dados. Para obter mais informações sobre átomos, consulte Sobre átomos.

Usos para o Windows Dynamic Data Exchange

O DDE é mais apropriado para trocas de dados que não exigem interação contínua do usuário. Normalmente, um aplicativo fornece um método para o usuário estabelecer o link entre os aplicativos que trocam dados. Uma vez que esse vínculo é estabelecido, no entanto, os aplicativos trocam dados sem envolvimento adicional do usuário.

O DDE pode ser usado para implementar uma ampla gama de recursos de aplicativos — por exemplo:

  • Vinculação a dados em tempo real, como atualizações do mercado de ações, instrumentos científicos ou controle de processos.
  • Criação de documentos compostos, como um documento de processamento de texto que inclui um gráfico produzido por um aplicativo gráfico. Usando o DDE, o gráfico será alterado quando os dados de origem forem alterados, enquanto o restante do documento permanecerá o mesmo.
  • Executar consultas de dados entre aplicativos, como uma planilha consultando um banco de dados em busca de contas vencidas.

Troca dinâmica de dados do ponto de vista do usuário

O exemplo a seguir ilustra como dois aplicativos DDE podem cooperar, como visto do ponto de vista do usuário.

Um usuário de planilha deseja usar o Microsoft Excel para acompanhar o preço de uma determinada ação na Bolsa de Valores de Nova York. O usuário tem um aplicativo chamado Quote que, por sua vez, tem acesso aos dados da NYSE. A conversa DDE entre o Excel e o Quote ocorre da seguinte maneira:

  • O usuário inicia a conversa fornecendo o nome do aplicativo (Cotação) que fornecerá os dados e o tópico particular de interesse (NYSE). A conversa DDE resultante é usada para solicitar cotações em ações específicas.
  • O Excel transmite os nomes de aplicativos e tópicos para todos os aplicativos DDE atualmente em execução no sistema. Quote responde, estabelecendo uma conversa com o Excel sobre o tema NYSE.
  • O usuário pode então criar uma fórmula de planilha em uma célula que solicita que a planilha seja atualizada automaticamente sempre que uma determinada cotação de ações for alterada. Por exemplo, o usuário pode solicitar uma atualização automática sempre que ocorrer uma alteração no preço de venda das ações da ZAXX especificando a seguinte fórmula do Excel: ='Cotação'|' NYSE'! ZAXX
  • O usuário pode encerrar a atualização automática da cotação das ações da ZAXX a qualquer momento. Outros links de dados que foram estabelecidos separadamente (como para cotações de outras ações) ainda permanecerão ativos sob a mesma conversa na NYSE.
  • O usuário também pode encerrar toda a conversa entre Excel e Quote sobre o tópico NYSE, para que nenhum link de dados específico sobre esse tópico possa ser estabelecido sem iniciar uma nova conversa.

Conceitos de troca dinâmica de dados

As seções a seguir explicam os conceitos e a terminologia importantes que são fundamentais para entender a troca dinâmica de dados.

Cliente, servidor e conversação

Dois aplicativos que participam do DDE estariam envolvidos em uma conversa com o DDE. O aplicativo que inicia a conversa é o aplicativo cliente DDE; o aplicativo que responde ao cliente é o aplicativo de servidor DDE. Um aplicativo pode se envolver em várias conversas ao mesmo tempo, atuando como cliente em alguns e como servidor em outros.

Uma conversa DDE ocorre entre duas janelas, uma para cada um dos aplicativos participantes. Uma janela pode ser a janela principal do aplicativo; uma janela associada a um documento específico, como em um aplicativo de interface de vários documentos (MDI); ou uma janela oculta (invisível) cuja única finalidade é processar mensagens DDE.

Como uma conversa DDE é identificada pelo par de alças para as janelas envolvidas na conversa, nenhuma janela deve ser envolvida em mais de uma conversa com outra janela. O aplicativo cliente ou o aplicativo servidor deve fornecer uma janela diferente para cada uma de suas conversas com um determinado servidor ou aplicativo cliente.

Um aplicativo pode garantir que um par de janelas de cliente e servidor nunca esteja envolvido em mais de uma conversa, criando uma janela oculta para cada conversa. O único objetivo desta janela é processar mensagens DDE.

Nomes de aplicativos, tópicos e itens

O protocolo DDE identifica as unidades de dados passadas entre o cliente e o servidor com uma hierarquia de três níveis de nomes de aplicativos, tópicos e itens.

Cada conversa DDE é definida exclusivamente pelo nome e tópico do aplicativo. No início de uma conversa DDE, o cliente e o servidor determinam o nome e o tópico do aplicativo. O nome do aplicativo geralmente é o nome do aplicativo do servidor. Por exemplo, quando o Excel atua como o servidor em uma conversa, o nome do aplicativo é Excel.

O tópico DDE é uma classificação geral de dados dentro da qual vários itens de dados podem ser "discutidos" (trocados) durante a conversa. Para aplicativos que operam em documentos baseados em arquivo, o tópico geralmente é um nome de arquivo. Para outros aplicativos, o tópico é um nome específico do aplicativo.

Como a janela do cliente e do servidor identifica juntos uma conversa DDE, o nome do aplicativo e o tópico que definem uma conversa não podem ser alterados durante o curso da conversa.

Um item de dados DDE são informações relacionadas ao tópico de conversa trocado entre os aplicativos. Os valores para o item de dados podem ser passados do servidor para o cliente ou do cliente para o servidor. Os dados podem ser passados com qualquer um dos formatos padrão da área de transferência ou com um formato de área de transferência registrado. Um formato especial registrado chamado Link identifica um item em uma conversa DDE. Para obter mais informações sobre formatos de área de transferência, consulte Área de transferência.

O tópico do sistema

Os aplicativos devem oferecer suporte ao tópico do sistema em todos os momentos. Este tópico fornece um contexto para informações que podem ser de interesse geral para outro aplicativo.

Os valores de item de dados devem ser renderizados no formato CF_TEXT da área de transferência. Os elementos individuais dos valores de item para um tópico do sistema devem ser delimitados por caracteres de tabulação. A tabela a seguir sugere alguns itens para o tópico do sistema.

Item Descrição
Formatos Lista delimitada por tabulação de formatos da área de transferência que o aplicativo pode renderizar. Normalmente, os formatos de CF_ são listados com a parte "CF_" dos nomes removidos (por exemplo, CF_TEXT é listado como "TEXTO").
Ajuda Texto que explica brevemente como usar o servidor DDE.
ReturnMessage Detalhes de suporte para a mensagem de WM_DDE_ACK usada mais recentemente. Este item é útil quando mais de oito bits de dados de retorno específicos do aplicativo são necessários.
Status Indicação do estado actual do pedido. Quando um servidor recebe uma mensagem de WM_DDE_REQUEST para esse item de tópico do sistema, ele deve responder postando uma mensagem de WM_DDE_DATA com uma cadeia de caracteres contendo Ocupado ou Pronto, conforme apropriado.
SysItems Lista de itens de tópico do sistema que o aplicativo suporta.
TopicItemList Semelhante ao item SysItems, exceto que TopicItemList deve ter suporte para cada tópico diferente do tópico do sistema. Isso permite a navegação dos itens suportados em qualquer tópico. Se os itens não puderem ser enumerados, esse item deverá conter apenas "TopicItemList".
Tópicos Lista de tópicos que o aplicativo suporta no momento atual; Essa lista pode variar de momento para momento.

 

Depois que uma conversa DDE é iniciada, o cliente pode estabelecer um ou mais links de dados permanentes com o servidor. Um link de dados é um mecanismo de comunicação pelo qual o servidor notifica o cliente sempre que o valor de um item de dados especificado é alterado. O link de dados é permanente no sentido de que esse processo de notificação continua até que o link de dados ou a própria conversa DDE seja encerrada.

Existem dois tipos de links de dados DDE permanentes: quente e quente. Em um link de dados quentes, o servidor notifica o cliente de que o valor do item de dados foi alterado, mas o servidor não envia o valor de dados para o cliente até que o cliente o solicite. Em um link de dados quentes, o servidor envia imediatamente o valor de dados alterado para o cliente.

Os aplicativos que oferecem suporte a links de dados quentes ou quentes geralmente fornecem um comando Copiar ou Colar Link em seu menu Editar para permitir que o usuário estabeleça links entre aplicativos.

Átomos e objetos de memória compartilhada

Certos argumentos de mensagens DDE são átomos globais ou objetos de memória compartilhada. Os aplicativos que usam esses argumentos devem seguir regras explícitas sobre quando alocá-los e excluí-los. Em todos os casos, o remetente da mensagem deve excluir qualquer objeto de átomo ou memória compartilhada que o receptor pretendido não receberá devido a uma condição de erro, como falha da função PostMessage .

O DDE usa objetos de memória compartilhada para três finalidades:

Um aplicativo que recebe um objeto de memória compartilhada DDE deve tratá-lo como somente leitura. O aplicativo não deve usar o objeto como uma área de leitura-gravação mútua para a troca livre de dados.

Como faz com um átomo DDE, um aplicativo deve liberar um objeto de memória compartilhada para gerenciar a memória de forma eficaz. O aplicativo também deve bloquear e desbloquear objetos de memória.

Visão geral das mensagens de troca de dados dinâmicos

Como o DDE é um protocolo baseado em mensagem, ele não emprega funções ou bibliotecas. Todas as transações DDE são conduzidas passando determinadas mensagens DDE definidas entre as janelas do cliente e do servidor.

Há nove mensagens DDE; as constantes simbólicas para essas mensagens são definidas no arquivo de cabeçalho DDE. Determinadas estruturas para as várias mensagens DDE também são definidas neste arquivo de cabeçalho.

A tabela a seguir resume as mensagens DDE.

Mensagem Descrição
WM_DDE_ACK Reconhece o recebimento ou não de uma mensagem.
WM_DDE_ADVISE Solicita que o aplicativo de servidor forneça uma atualização ou notificação para um item de dados sempre que ele for alterado. Isso estabelece um link de dados permanente.
WM_DDE_DATA Envia um valor de item de dados para o aplicativo cliente.
WM_DDE_EXECUTE Envia uma cadeia de caracteres para o aplicativo do servidor, que deve processar a cadeia de caracteres como uma série de comandos.
WM_DDE_INITIATE Inicia uma conversa entre os aplicativos cliente e servidor.
WM_DDE_POKE Envia um valor de item de dados para o aplicativo do servidor.
WM_DDE_REQUEST Solicita que o aplicativo de servidor forneça o valor de um item de dados.
WM_DDE_TERMINATE Encerra uma conversa.
WM_DDE_UNADVISE Encerra um link de dados permanente.

 

Um aplicativo chama SendMessage para emitir a mensagem de WM_DDE_INITIATE ou uma mensagem de WM_DDE_ACK enviada em resposta a WM_DDE_INITIATE. Todas as outras mensagens são enviadas por PostMessage. O primeiro parâmetro dessas chamadas é um identificador para a janela de recebimento; o segundo parâmetro contém a mensagem a ser enviada; o terceiro parâmetro identifica a janela de envio; e o quarto parâmetro contém os argumentos específicos da mensagem.

Fluxo dinâmico de mensagens de troca de dados

Uma conversa DDE típica consiste nos seguintes eventos:

  1. O aplicativo cliente inicia a conversa e o aplicativo servidor responde.

  2. Os aplicativos trocam dados por um ou todos os seguintes métodos:

      • O aplicativo de servidor envia dados para o cliente a pedido do cliente.
      • O aplicativo cliente envia dados não solicitados para o aplicativo servidor.
      • O aplicativo cliente solicita que o aplicativo servidor notifique o cliente sempre que um item de dados for alterado (link de dados quentes).
      • O aplicativo cliente solicita que o aplicativo servidor envie dados sempre que os dados forem alterados (link de dados quentes).
      • O aplicativo de servidor executa um comando a pedido do cliente.
  3. O aplicativo cliente ou servidor encerra a conversa.

Uma janela de aplicativo que processa solicitações de um cliente ou servidor deve processá-las estritamente na ordem em que são recebidas.

Um cliente pode estabelecer conversas com mais de um servidor; Um servidor pode ter conversas com mais de um cliente. Ao manipular mensagens de mais de uma origem, um cliente ou servidor deve processar as mensagens de uma conversa de forma síncrona, mas não precisa processar todas as mensagens de forma síncrona. Em outras palavras, ele pode mudar de uma conversa para outra conforme necessário.

Se um aplicativo não puder processar uma solicitação de entrada porque está aguardando uma resposta DDE, ele deverá evitar o deadlock postando uma mensagem WM_DDE_ACK com o membro fBusy da estrutura DDEACK definido como 1. Um aplicativo também pode enviar uma mensagem de WM_DDE_ACK ocupada se, por qualquer motivo, não puder processar uma solicitação de entrada dentro de um período de tempo razoável.

Um aplicativo deve ser capaz de lidar com a falha de um cliente ou servidor para responder a uma mensagem dentro de um determinado tempo. Como o intervalo de tempo limite pode variar dependendo da natureza do aplicativo e da configuração do sistema do usuário (incluindo se ele está conectado a uma rede), o aplicativo deve fornecer uma maneira para o usuário especificar o intervalo.

Funções de empacotamento de parâmetros

O parâmetro lParam de muitas mensagens DDE contém duas partes de dados. Por exemplo, o lParam da mensagem WM_DDE_DATA contém um identificador de dados e um átomo. Os aplicativos devem usar a função PackDDElParam para empacotar o identificador e o atom em um parâmetro lParam e a função UnpackDDElParam para remover os valores. Os aplicativos DDE devem usar PackDDElParam e UnpackDDElParam para todas as mensagens postadas durante uma conversa DDE.

Os aplicativos também podem usar as funções ReuseDDElParam e FreeDDElParam. ReuseDDElParam permite que um aplicativo DDE reutilize um parâmetro lParam compactado, ajudando a reduzir o número de realocações de memória que o aplicativo deve executar durante uma conversa. Um aplicativo pode usar FreeDDElParam para liberar a memória associada a um identificador de dados recebido durante uma conversa DDE.

Troca dinâmica de dados e representação

Para permitir que um servidor represente um cliente, o cliente chama a função DdeSetQualityOfService. A estrutura SECURITY_IMPERSONATION_LEVEL é usada para controlar o nível de representação que o servidor pode executar.

Um servidor DDE pode representar um cliente DDE chamando a função ImpersonateDdeClientWindow. Um servidor DDEML deve usar a função DdeImpersonateClient.