Supervisión de aplicaciones
Los elementos de API de la biblioteca de administración de datos dinámicos Exchange (DDEML) de datos dinámicos (DDEML) se pueden usar para crear una aplicación que supervise la actividad de datos dinámicos Exchange (DDE) en el sistema. Al igual que cualquier aplicación DDEML, una aplicación de supervisión DDE contiene una función de devolución de llamada DDE. DDEML notifica a una función de devolución de llamada DDE de una aplicación de supervisión cada vez que se produce un evento DDE, pasando información sobre el evento a la función de devolución de llamada. Normalmente, la aplicación muestra la información en una ventana o la escribe en un archivo.
Para recibir notificaciones de DDEML, una aplicación debe haberse registrado como un monitor DDE especificando la marca APPCLASS_MONITOR en una llamada a la función DdeInitialize . En esta misma llamada, la aplicación puede especificar una o varias marcas de monitor para indicar los tipos de eventos para los que DDEML debe notificar a la función de devolución de llamada de la aplicación. Una aplicación puede especificar las marcas de supervisión siguientes:
Marca | Descripción |
---|---|
MF_CALLBACKS | Notifica a la función de devolución de llamada cada vez que se envía una transacción a cualquier función de devolución de llamada DDE del sistema. |
MF_CONV | Notifica a la función de devolución de llamada cada vez que se establece o finaliza una conversación. |
MF_ERRORS | Notifica a la función de devolución de llamada cada vez que se produce un error DDEML. |
MF_HSZ_INFO | Notifica a la función de devolución de llamada cada vez que una aplicación DDEML crea, libera o incrementa el recuento de uso de un identificador de cadena o cada vez que se libera un identificador de cadena como resultado de una llamada a la función DdeUninitialize . |
MF_LINKS | Notifica a la función de devolución de llamada cada vez que se inicia o finaliza un bucle de aviso. |
MF_POSTMSGS | Notifica a la función de devolución de llamada cada vez que el sistema o una aplicación publique un mensaje DDE. |
MF_SENDMSGS | Notifica a la función de devolución de llamada cada vez que el sistema o una aplicación envían un mensaje DDE. |
En el ejemplo siguiente se muestra cómo registrar una aplicación de supervisión DDE para que su función de devolución de llamada DDE reciba notificaciones de todos los eventos DDE.
DWORD idInst;
PFNCALLBACK lpDdeProc;
hInst = hInstance;
if (DdeInitialize(
(LPDWORD) &idInst, // instance identifier
DDECallback, // pointer to callback function
APPCLASS_MONITOR | // this is a monitoring application
MF_CALLBACKS | // monitor callback functions
MF_CONV | // monitor conversation data
MF_ERRORS | // monitor DDEML errors
MF_HSZ_INFO | // monitor data handle activity
MF_LINKS | // monitor advise loops
MF_POSTMSGS | // monitor posted DDE messages
MF_SENDMSGS, // monitor sent DDE messages
0)) // reserved
{
return FALSE;
}
El DDEML informa a una aplicación de supervisión de un evento DDE mediante el envío de una transacción de XTYP_MONITOR a la función de devolución de llamada DDE de la aplicación. Durante esta transacción, DDEML pasa una marca de monitor que especifica el tipo de evento DDE que se ha producido y un identificador a un objeto DDE que contiene información detallada sobre el evento. DDEML proporciona un conjunto de estructuras que la aplicación puede usar para extraer la información del objeto DDE. Hay una estructura correspondiente para cada tipo de evento DDE.
Estructura | Descripción |
---|---|
MONCBSTRUCT | Contiene información sobre una transacción. |
MONCONVSTRUCT | Contiene información sobre una conversación. |
MONERRSTRUCT | Contiene información sobre el error de DDE más reciente. |
MONLINKSTRUCT | Contiene información sobre un bucle de asesoramiento. |
MONHSZSTRUCT | Contiene información sobre un identificador de cadena. |
MONMSGSTRUCT | Contiene información sobre un mensaje DDE enviado o publicado. |
En el ejemplo siguiente se muestra la función de devolución de llamada DDE de una aplicación de supervisión de DDE que da formato a la información sobre cada evento de identificador de cadena y, a continuación, muestra la información en una ventana. La función usa la estructura MONHSZSTRUCT para extraer la información del objeto DDE.
HDDEDATA CALLBACK DDECallback(uType, uFmt, hconv, hsz1, hsz2,
hdata, dwData1, dwData2)
UINT uType;
UINT uFmt;
HCONV hconv;
HSZ hsz1;
HSZ hsz2;
HDDEDATA hdata;
DWORD dwData1;
DWORD dwData2;
{
LPVOID lpData;
CHAR *szAction;
CHAR szBuf[256];
DWORD cb;
HRESULT hResult;
switch (uType)
{
case XTYP_MONITOR:
// Obtain a pointer to the global memory object.
if (lpData = DdeAccessData(hdata, &cb))
{
// Examine the monitor flag.
switch (dwData2)
{
case MF_HSZ_INFO:
#define PHSZS ((MONHSZSTRUCT *)lpData)
// The global memory object contains
// string handle data. Use the MONHSZSTRUCT
// structure to access the data.
switch (PHSZS->fsAction)
{
// Examine the action flags to determine
// the action performed on the handle.
case MH_CREATE:
szAction = "Created";
break;
case MH_KEEP:
szAction = "Incremented";
break;
case MH_DELETE:
szAction = "Deleted";
break;
case MH_CLEANUP:
szAction = "Cleaned up";
break;
default:
DdeUnaccessData(hdata);
return (HDDEDATA) 0;
}
// Write formatted output to a buffer.
hResult = StringCchPrintf(szBuf, 256/sizeof(TCHAR),
"Handle %s, Task: %x, Hsz: %lx(%s)",
(LPSTR) szAction, PHSZS->hTask,
PHSZS->hsz, (LPSTR) PHSZS->str);
if (FAILED(hResult))
{
// TO DO: Write error handler.
return;
}
// Display text or write to a file.
break;
#undef PHSZS
// Process other MF_* flags.
default:
break;
}
}
// Free the global memory object.
DdeUnaccessData(hdata);
break;
default:
break;
}
return (HDDEDATA) 0;
}