Acerca del intercambio de datos dinámicos
Windows proporciona varios métodos para transferir datos entre aplicaciones. Un método consiste en usar el protocolo de Intercambio de datos dinámicos (DDE). El protocolo DDE es un conjunto de mensajes e instrucciones. Envía mensajes entre aplicaciones que comparten datos y usa memoria compartida para intercambiar datos entre aplicaciones. Las aplicaciones pueden usar el protocolo DDE para transferencias de datos de un solo uso y para intercambios continuos en los que las aplicaciones envían actualizaciones entre sí a medida que los nuevos datos estén disponibles.
Windows también admite la biblioteca de administración de Intercambio de datos dinámicos (DDEML). DDEML es una biblioteca de vínculos dinámicos (DLL) que las aplicaciones pueden usar para compartir datos. DDEML proporciona funciones y mensajes que simplifican la tarea de agregar la funcionalidad DDE a una aplicación. En lugar de enviar, publicar y procesar mensajes DDE directamente, una aplicación usa las funciones DDEML para administrar las conversaciones de DDE. (Una conversación DDE es la interacción entre las aplicaciones cliente y servidor).
DDEML también proporciona una facilidad para administrar las cadenas y los datos que comparten las aplicaciones DDE. En lugar de usar átomos y punteros para objetos de memoria compartidos, las aplicaciones DDE crean e intercambian identificadores de cadena, que identifican cadenas y identificadores de datos, que identifican objetos de memoria. DDEML también permite que una aplicación de servidor registre los nombres de servicio que admite. Los nombres se transmiten a otras aplicaciones del sistema, que pueden usar los nombres para conectarse al servidor. Además, DDEML garantiza la compatibilidad entre las aplicaciones DDE al obligarlos a implementar el protocolo DDE de forma coherente.
Las aplicaciones existentes que usan el protocolo DDE basado en mensajes son totalmente compatibles con las que usan DDEML. Es decir, una aplicación que usa DDE basado en mensajes puede establecer conversaciones y realizar transacciones con aplicaciones que usan DDEML. Debido a las muchas ventajas de DDEML, las nuevas aplicaciones deben usarlas en lugar de los mensajes DDE. Para usar los elementos de API de DDEML, debe incluir el archivo de encabezado DDEML en los archivos de origen, vincular con la biblioteca DDEML y asegurarse de que la biblioteca de vínculos dinámicos DDEML está en la ruta de búsqueda del sistema.
En esta sección se describen los temas siguientes.
- Protocolo de intercambio dinámico de datos
- Usos para el intercambio de datos dinámicos de Windows
- Intercambio dinámico de datos desde el punto de vista del usuario
- Conceptos de Intercambio de datos dinámicos
- Introducción a los mensajes dinámicos de Intercambio de datos
- Flujo de mensajes dinámicos de Intercambio de datos
- Funciones de empaquetado de parámetros
- Intercambio dinámico de datos y suplantación
Protocolo de intercambio dinámico de datos
Dado que Windows tiene una arquitectura basada en mensajes, el paso de mensajes es el método más adecuado para transferir automáticamente información entre aplicaciones. Sin embargo, los mensajes solo contienen dos parámetros (wParam y lParam) para pasar datos. Como resultado, estos parámetros deben hacer referencia indirectamente a otros fragmentos de datos cuando se pasan más de unas pocas palabras de información entre aplicaciones. El protocolo DDE define exactamente cómo las aplicaciones deben usar los parámetros wParam y lParam para pasar fragmentos de datos más grandes mediante átomos globales y identificadores de memoria compartidos. El protocolo DDE tiene reglas específicas para asignar y eliminar átomos globales y objetos de memoria compartida.
Un átomo global es una referencia a una cadena de caracteres. En el protocolo DDE, los átomos identifican las aplicaciones que intercambian datos, la naturaleza de los datos que se intercambian y los propios elementos de datos. Para obtener más información sobre los átomos, vea Acerca de átomos.
Usos para el intercambio de datos dinámicos de Windows
DDE es más adecuado para los intercambios de datos que no requieren interacción continua del usuario. Normalmente, una aplicación proporciona un método para que el usuario establezca el vínculo entre las aplicaciones que intercambian datos. Sin embargo, una vez establecido ese vínculo, las aplicaciones intercambian datos sin ninguna intervención adicional del usuario.
DDE se puede usar para implementar una amplia gama de características de aplicación, por ejemplo:
- Vinculación a datos en tiempo real, como actualizaciones de mercado de valores, instrumentos científicos o control de procesos.
- Crear documentos compuestos, como un documento de procesamiento de texto que incluye un gráfico generado por una aplicación de gráficos. Con DDE, el gráfico cambiará cuando cambien los datos de origen, mientras que el resto del documento sigue siendo el mismo.
- Realizar consultas de datos entre aplicaciones, como una hoja de cálculo que consulta una base de datos para las cuentas vencidas.
Intercambio dinámico de datos desde el punto de vista del usuario
En el ejemplo siguiente se muestra cómo dos aplicaciones DDE pueden cooperar, como se ve desde el punto de vista del usuario.
Un usuario de hoja de cálculo quiere usar Microsoft Excel para realizar un seguimiento del precio de una acción determinada en la Bolsa de Nueva York. El usuario tiene una aplicación denominada Quote que, a su vez, tiene acceso a los datos DE LA COLECCIÓN. La conversación DDE entre Excel y Quote tiene lugar de la siguiente manera:
- El usuario inicia la conversación proporcionando el nombre de la aplicación (Quote) que proporcionará los datos y el tema de interés particular (XAML). La conversación DDE resultante se usa para solicitar cotizaciones sobre acciones específicas.
- Excel difunde los nombres de aplicación y tema a todas las aplicaciones DDE que se ejecutan actualmente en el sistema. La cita responde, estableciendo una conversación con Excel sobre el tema DE LA PROGRAMACIÓN.
- A continuación, el usuario puede crear una fórmula de hoja de cálculo en una celda que solicite que la hoja de cálculo se actualice automáticamente cada vez que cambie una cotización bursátil determinada. Por ejemplo, el usuario podría solicitar una actualización automática cada vez que se produzca un cambio en el precio de venta de acciones de ZAXX especificando la siguiente fórmula de Excel: ='Quote'|' ¡TAMPOCO! ZAXX
- El usuario puede finalizar la actualización automática de la cotización de acciones de ZAXX en cualquier momento. Otros enlaces de datos que se establecieron por separado (por ejemplo, para cotizaciones para otras acciones) seguirán estando activos en la misma conversación DE LA COLECCIÓN.
- El usuario también puede finalizar toda la conversación entre Excel y Quote en el tema DE LA PROGRAMACIÓN, de modo que no se puedan establecer vínculos de datos específicos sobre ese tema sin iniciar una nueva conversación.
Conceptos de Intercambio de datos dinámicos
En las secciones siguientes se explican los conceptos importantes y la terminología clave para comprender el intercambio dinámico de datos.
- Cliente, servidor y conversación
- Nombres de aplicación, tema y elemento
- Tema del sistema
- Vínculos de datos permanentes
- Átomos y objetos de memoria compartida
Cliente, servidor y conversación
Se dice que dos aplicaciones que participan en DDE se dedican a una conversación DDE. La aplicación que inicia la conversación es la aplicación cliente DDE; la aplicación que responde al cliente es la aplicación de servidor DDE. Una aplicación puede participar en varias conversaciones al mismo tiempo, actuando como el cliente en algunos y como el servidor en otros.
Una conversación DDE tiene lugar entre dos ventanas, una para cada una de las aplicaciones participantes. Una ventana puede ser la ventana principal de la aplicación; una ventana asociada a un documento específico, como en una aplicación de interfaz de varios documentos (MDI); o una ventana oculta (invisible) cuyo único propósito es procesar mensajes DDE.
Dado que una conversación DDE se identifica mediante el par de identificadores para las ventanas implicadas en la conversación, no se debe participar en más de una conversación con otra ventana. La aplicación cliente o la aplicación de servidor deben proporcionar una ventana diferente para cada una de sus conversaciones con un servidor o una aplicación cliente determinados.
Una aplicación puede asegurarse de que un par de ventanas de cliente y servidor nunca participa en más de una conversación mediante la creación de una ventana oculta para cada conversación. El único propósito de esta ventana es procesar mensajes DDE.
Nombres de aplicación, tema y elemento
El protocolo DDE identifica las unidades de datos que se pasan entre el cliente y el servidor con una jerarquía de tres niveles de nombres de aplicación, tema y elemento.
Cada conversación de DDE se define de forma única por el nombre y el tema de la aplicación. Al principio de una conversación DDE, el cliente y el servidor determinan el nombre y el tema de la aplicación. El nombre de la aplicación suele ser el nombre de la aplicación de servidor. Por ejemplo, cuando Excel actúa como servidor en una conversación, el nombre de la aplicación es Excel.
El tema DDE es una clasificación general de los datos en los que se pueden "analizar" varios elementos de datos (intercambiados) durante la conversación. En el caso de las aplicaciones que operan en documentos basados en archivos, el tema suele ser un nombre de archivo. Para otras aplicaciones, el tema es un nombre específico de la aplicación.
Dado que la ventana de cliente y servidor controla conjuntamente una conversación DDE, el nombre de la aplicación y el tema que definen una conversación no se pueden cambiar durante el transcurso de la conversación.
Un elemento de datos DDE es información relacionada con el tema de conversación intercambiado entre las aplicaciones. Los valores del elemento de datos se pueden pasar desde el servidor al cliente o desde el cliente al servidor. Los datos se pueden pasar con cualquiera de los formatos estándar del Portapapeles o con un formato de Portapapeles registrado. Un formato especial registrado denominado Link identifica un elemento en una conversación DDE. Para obtener más información sobre los formatos del Portapapeles, consulte Portapapeles.
Tema del sistema
Las aplicaciones deben admitir el tema del sistema en todo momento. En este tema se proporciona un contexto para obtener información que puede ser de interés general para otra aplicación.
Los valores de elemento de datos deben representarse en el formato del Portapapeles CF_TEXT . Los elementos individuales de los valores de elemento de un tema del sistema deben delimitarse por caracteres de tabulación. En la tabla siguiente se sugieren algunos elementos para el tema del sistema.
Elemento | Descripción |
---|---|
Formatos | Lista delimitada por tabulaciones de formatos de Portapapeles que la aplicación puede representar. Normalmente, los formatos de CF_ se enumeran con la parte "CF_" de los nombres quitados (por ejemplo, CF_TEXT aparece como "TEXT"). |
Ayuda | Texto que explica brevemente cómo usar el servidor DDE. |
ReturnMessage | Detalles de soporte técnico para el mensaje de WM_DDE_ACK usado más recientemente. Este elemento es útil cuando se requieren más de ocho bits de datos devueltos específicos de la aplicación. |
Estado | Indicación del estado actual de la aplicación. Cuando un servidor recibe un mensaje de WM_DDE_REQUEST para este elemento de tema del sistema, debe responder publicando un mensaje de WM_DDE_DATA con una cadena que contenga Ocupado o Listo, según corresponda. |
SysItems | Lista de elementos del tema del sistema que admite la aplicación. |
TopicItemList | De forma similar al elemento SysItems, salvo que TopicItemList debe admitirse para cada tema distinto del tema del sistema. Esto permite la exploración de los elementos admitidos en cualquier tema. Si no se pueden enumerar los elementos, este elemento debe contener solo "TopicItemList". |
Temas | Lista de temas que la aplicación admite en el momento actual; esta lista puede variar de un momento a otro. |
Vínculos de datos permanentes
Una vez iniciada una conversación DDE, el cliente puede establecer uno o varios vínculos de datos permanentes con el servidor. Un vínculo de datos es un mecanismo de comunicaciones por el que el servidor notifica al cliente cada vez que cambia el valor de un elemento de datos especificado. El vínculo de datos es permanente en el sentido de que este proceso de notificación continúa hasta que finaliza el vínculo de datos o la propia conversación DDE.
Hay dos tipos de vínculos de datos DDE permanentes: cálido y frecuente. En un vínculo de datos intermedio, el servidor notifica al cliente que el valor del elemento de datos ha cambiado, pero el servidor no envía el valor de datos al cliente hasta que el cliente lo solicite. En un vínculo de datos frecuente, el servidor envía inmediatamente el valor de datos cambiado al cliente.
Las aplicaciones que admiten vínculos de datos activos o activos suelen proporcionar un comando Copiar o Pegar vínculo en el menú Edición para permitir al usuario establecer vínculos entre aplicaciones.
Átomos y objetos de memoria compartida
Algunos argumentos de los mensajes DDE son átomos globales o objetos de memoria compartidos. Las aplicaciones que usan estos argumentos deben seguir reglas explícitas sobre cuándo asignarlos y eliminarlos. En todos los casos, el remitente del mensaje debe eliminar cualquier objeto atom o de memoria compartida que el receptor deseado no reciba debido a una condición de error, como el error de la función PostMessage .
DDE usa objetos de memoria compartidos para tres propósitos:
- Para llevar un valor de elemento de datos que se va a intercambiar. Se trata de un elemento al que hace referencia el parámetro hData en el WM_DDE_DATA y WM_DDE_POKE mensajes.
- Para llevar opciones en un mensaje. Este es un elemento al que hace referencia el parámetro hOptions en un mensaje de WM_DDE_ADVISE .
- Para llevar una cadena de ejecución de comandos. Se trata de un elemento al que hace referencia el parámetro hCommands en el mensaje WM_DDE_EXECUTE y su mensaje de WM_DDE_ACK correspondiente.
Una aplicación que recibe un objeto de memoria compartida DDE debe tratarlo como de solo lectura. La aplicación no debe usar el objeto como un área de lectura y escritura mutua para el intercambio gratuito de datos.
Al igual que con un átomo DDE, una aplicación debe liberar un objeto de memoria compartida para administrar la memoria de forma eficaz. La aplicación también debe bloquear y desbloquear objetos de memoria.
Información general sobre mensajes de intercambio de datos dinámicos
Dado que DDE es un protocolo basado en mensajes, no emplea funciones ni bibliotecas. Todas las transacciones DDE se realizan pasando determinados mensajes DDE definidos entre las ventanas de cliente y servidor.
Hay nueve mensajes DDE; las constantes simbólicas de estos mensajes se definen en el archivo de encabezado DDE. Algunas estructuras de los distintos mensajes DDE también se definen en este archivo de encabezado.
En la tabla siguiente se resumen los mensajes DDE.
Message | Descripción |
---|---|
WM_DDE_ACK | Confirma la recepción o no recepción de un mensaje. |
WM_DDE_ADVISE | Solicita a la aplicación de servidor que proporcione una actualización o notificación para un elemento de datos siempre que cambie. Esto establece un vínculo de datos permanente. |
WM_DDE_DATA | Envía un valor de elemento de datos a la aplicación cliente. |
WM_DDE_EXECUTE | Envía una cadena a la aplicación de servidor, que se espera que procese la cadena como una serie de comandos. |
WM_DDE_INITIATE | Inicia una conversación entre las aplicaciones cliente y servidor. |
WM_DDE_POKE | Envía un valor de elemento de datos a la aplicación de servidor. |
WM_DDE_REQUEST | Solicita a la aplicación de servidor que proporcione el valor de un elemento de datos. |
WM_DDE_TERMINATE | Finaliza una conversación. |
WM_DDE_UNADVISE | Finaliza un vínculo de datos permanente. |
Una aplicación llama a SendMessage para emitir el mensaje de WM_DDE_INITIATE o un mensaje de WM_DDE_ACK enviado en respuesta a WM_DDE_INITIATE. PostMessage envía todos los demás mensajes. El primer parámetro de estas llamadas es un identificador para la ventana receptora; el segundo parámetro contiene el mensaje que se va a enviar; el tercer parámetro identifica la ventana de envío; y el cuarto parámetro contiene los argumentos específicos del mensaje.
Flujo de mensajes dinámicos de Intercambio de datos
Una conversación de DDE típica consta de los siguientes eventos:
La aplicación cliente inicia la conversación y la aplicación de servidor responde.
Las aplicaciones intercambian datos por cualquiera o todos los métodos siguientes:
-
- La aplicación de servidor envía datos al cliente en la solicitud del cliente.
- La aplicación cliente envía datos no solicitados a la aplicación de servidor.
- La aplicación cliente solicita a la aplicación de servidor que notifique al cliente cada vez que cambia un elemento de datos (vínculo de datos intermedio).
- La aplicación cliente solicita a la aplicación de servidor que envíe datos cada vez que cambien los datos (vínculo de datos frecuente).
- La aplicación de servidor lleva a cabo un comando en la solicitud del cliente.
-
La aplicación cliente o servidor finaliza la conversación.
Una ventana de aplicación que procesa las solicitudes de un cliente o servidor debe procesarlas estrictamente en el orden en que se reciben.
Un cliente puede establecer conversaciones con más de un servidor; un servidor puede tener conversaciones con más de un cliente. Al controlar mensajes de más de un origen, un cliente o servidor debe procesar los mensajes de una conversación de forma sincrónica, pero no necesita procesar todos los mensajes de forma sincrónica. En otras palabras, puede cambiar de una conversación a otra según sea necesario.
Si una aplicación no puede procesar una solicitud entrante porque está esperando una respuesta DDE, debe evitar el interbloqueo publicando un mensaje de WM_DDE_ACK con el miembro fBusy de la estructura DDEACK establecida en 1. Una aplicación también puede enviar un mensaje de WM_DDE_ACK ocupado si, por cualquier motivo, no puede procesar una solicitud entrante dentro de un período de tiempo razonable.
Una aplicación debe poder controlar el error de un cliente o servidor para responder a un mensaje en un momento determinado. Dado que el intervalo de tiempo de espera puede variar en función de la naturaleza de la aplicación y de la configuración del sistema del usuario (incluido si está conectado a una red), la aplicación debe proporcionar una manera para que el usuario especifique el intervalo.
Funciones de empaquetado de parámetros
El parámetro lParam de muchos mensajes DDE contiene dos fragmentos de datos. Por ejemplo, el lParam del mensaje WM_DDE_DATA contiene un identificador de datos y un átomo. Las aplicaciones deben usar la función PackDDElParam para empaquetar el identificador y el átomo en un parámetro lParam y la función UnpackDDElParam para quitar los valores. Las aplicaciones DDE deben usar PackDDElParam y UnpackDDElParam para todos los mensajes publicados durante una conversación DDE.
Las aplicaciones también pueden usar las funciones ReuseDDElParam y FreeDDElParam . ReuseDDElParam permite que una aplicación DDE reutilice un parámetro lParam empaquetado, lo que ayuda a reducir el número de reasignaciones de memoria que la aplicación debe realizar durante una conversación. Una aplicación puede usar FreeDDElParam para liberar la memoria asociada a un identificador de datos recibido durante una conversación DDE.
Intercambio dinámico de datos y suplantación
Para permitir que un servidor suplanta a un cliente, el cliente llama a la función DdeSetQualityOfService . La estructura SECURITY_IMPERSONATION_LEVEL se usa para controlar el nivel de suplantación que puede realizar el servidor.
Un servidor DDE puede suplantar a un cliente DDE llamando a la función ImpersonateDdeClientWindow . Un servidor DDEML debe usar la función DdeImpersonateClient .