Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 ficam disponíveis.
O Windows também suporta a Biblioteca de Gerenciamento do Intercâmbio de Dados Dinâmicos (DDEML). 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 a capacidade 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 compartilhados, 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 suportados. 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 as aplicações DDE, forçando-as a implementar o protocolo DDE de forma 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 da API do DDEML, você deve incluir o arquivo de cabeçalho DDEML em seus arquivos de origem, vincular à biblioteca DDEML e garantir que a biblioteca de vínculo dinâmico DDEML esteja no caminho de pesquisa do sistema.
Protocolo de intercâmbio dinâmico de dados
Como o Windows tem uma arquitetura baseada em mensagens, passar mensagens é o método mais apropriado para transferir automaticamente informações 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 do Windows para Troca Dinâmica de Dados
O DDE é mais apropriado para trocas de dados que não exigem interação contínua do usuário. Normalmente, uma aplicação fornece um método para o utilizador estabelecer a ligação entre as aplicações que trocam dados. No entanto, uma vez estabelecida essa ligação, as aplicações trocam dados sem qualquer outro envolvimento dos utilizadores.
O DDE pode ser usado para implementar uma ampla gama de recursos de aplicativos — por exemplo:
- Ligar 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 DDE, o gráfico mudará 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.
Intercâmbio dinâmico de dados do ponto de vista do utilizador
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 forma:
- 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 tópico da 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 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 de ações 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 o Excel e o Quote no tópico da NYSE, para que nenhum link de dados específico sobre esse tópico possa ser estabelecido sem iniciar uma nova conversa.
Conceitos de intercâmbio dinâmico de dados
As secções seguintes explicam os conceitos e a terminologia importantes que são fundamentais para compreender o intercâmbio dinâmico de dados.
- Cliente, servidor e conversação
- Nomes de aplicativos, tópicos e itens
- O Tópico do Sistema
- Links de dados permanentes
- Átomos e objetos de memória compartilhada
Cliente, servidor e conversação
Dois aplicativos que participam do DDE estariam envolvidos em uma conversa do 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, agindo como o cliente em alguns e como o 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) cujo único objetivo é processar mensagens DDE.
Como uma conversa DDE é identificada pelo par de identificadores das janelas envolvidas na conversa, nenhuma janela deve estar envolvida em mais de uma conversa com outra janela ao mesmo tempo. 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 de 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 arquivos, 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 em conjunto uma conversa DDE, o nome do aplicativo e o tópico que definem uma conversa não podem ser alterados durante a conversa.
Um item de dados DDE é a informação relacionada ao tópico de conversação 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 Clipboard.
Tópico do Sistema
Os aplicativos devem suportar o 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 dos itens de dados devem ser renderizados no formato de área de transferência CF_TEXT. 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.
| Iteme | Descrição |
|---|---|
| Formatos | Lista delimitada por tabulações dos formatos da área de transferência que o aplicativo pode renderizar. Normalmente, CF_ formatos são listados com a parte "CF_" dos nomes removidos (por exemplo, CF_TEXT está listado como "TEXTO"). |
| Ajuda | Texto que explica brevemente como usar o servidor DDE. |
| MensagemDeRetorno | Detalhes de suporte para a mensagem 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. |
| Situação | Indicar a situação atual do pedido. Quando um servidor recebe uma mensagem WM_DDE_REQUEST para este item de tópico do sistema, ele deve responder com uma mensagem WM_DDE_DATA contendo uma cadeia de caracteres com Ocupado ou Pronto, conforme apropriado. |
| SysItems | Lista de itens de tópico do sistema suportados pelo aplicativo. |
| ListaDeItensDeTópico | Semelhante ao item SysItems, exceto que TopicItemList deve ser suportado 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, este item deve conter apenas "TopicItemList". |
| Tópicos | Lista de tópicos que a aplicação suporta no momento atual; Esta lista pode variar de momento para momento. |
Ligações permanentes de dados
Uma vez iniciada uma conversa DDE, 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 muda. 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: morno e quente. Em um link de dados quente, 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 quente, o servidor envia imediatamente o valor de dados alterado para o cliente.
Os programas que suportam ligações de dados mornos ou quentes normalmente fornecem um comando Copiar ou Colar Ligação no menu Editar para permitir que o utilizador estabeleça ligações entre aplicações.
Á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 átomo ou objeto de memória compartilhada que o recetor 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:
- Transportar um valor de item de dados a ser trocado. Este é um item referenciado pelo parâmetro hData nas mensagens WM_DDE_DATA e WM_DDE_POKE .
- Para carregar opções em uma mensagem. Este é um item referenciado pelo parâmetro hOptions em uma mensagem WM_DDE_ADVISE .
- Para transportar uma string de execução de comando. Este é um item referenciado pelo parâmetro hCommands na mensagem WM_DDE_EXECUTE e sua mensagem WM_DDE_ACK correspondente.
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 livre troca 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 do Dynamic Data Exchange
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. Certas 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 ter recebido ou não receber uma mensagem. |
| WM_DDE_ADVISE | Solicita que o aplicativo servidor forneça uma atualização ou notificação para um item de dados sempre que ele for alterado. Isto estabelece uma ligação 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 de 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 de 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 WM_DDE_INITIATE ou uma mensagem 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 receção; 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 de mensagens do Dynamic Data Exchange
Uma conversa DDE típica consiste nos seguintes eventos:
- O aplicativo cliente inicia a conversa e o aplicativo de servidor responde.
- 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 de servidor.
- O aplicativo cliente solicita que o aplicativo servidor notifique o cliente sempre que um item de dados for alterado (link de dados quente).
- A aplicação cliente solicita que a aplicação servidor envie dados sempre que os dados forem alterados (link de dados dinâmico).
- O aplicativo de servidor executa um comando a pedido do cliente.
- 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 fonte, 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 conseguir processar uma solicitação de entrada porque está aguardando uma resposta DDE, ele deve 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 agrupamento 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 átomo 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.
Intercâmbio dinâmico de dados e Impersonaçã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 imitaçã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 .