Tecnología

Inicio

Cómo ejecutar Excel como un servidor DDE

Cómo ejecutar Excel como un servidor DDE


Intercambio dinámico de datos (DDE) es un protocolo de mensaje que da a las aplicaciones de Windows las herramientas para el intercambio de datos de forma automática. Cómo hacer una aplicación que proporciona datos a programas como Excel es un uso principal de DDE. Si usted tenía un programa que fue alimentado con cotizaciones bursátiles a medida que ocurren, por ejemplo, DDE podría permitir a un usuario de Excel para ver esa información y hacer referencia a ella correctamente en sus cálculos. Cualquiera sea la razón, la creación de un servidor de base de DDE es un reto, pero ciertamente alcanzable.

Instrucciones

Construir un servidor DDE

1 Abra Visual C ++ 6.0 y empezar un "Nuevo Proyecto".

2 Haga clic en "Win32Application" para seleccionarlo como el tipo de proyecto, a continuación, el nombre de "DdemlSvr." Seleccione "un proyecto vacío" cuando se le preguntó por el tipo de proyecto que desee.

3 Añadir un archivo llamado "main.cpp." a su proyecto.

4 Copia el siguiente código:

incluir <windows.h> incluir <stdio.h> incluir <ddeml.h>

// Globals ...

HSZ g_hszAppName;

HSZ g_hszTopicName;

HSZ g_hszItemName;

int g_count = 0;

DWORD g_idInst = 0;

// Datos:

HDDEDATA EXPENTRY DdeCallback (tipo UINT, FMT UINT, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2);

// WinMain () ..

int APIENTRY WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

// Inicializar DDEML ...

si (DdeInitialize (y g_idInst, DdeCallback, APPCLASS_STANDARD, 0)) {

MessageBox(NULL, "DdeInitialize() failed", "Error", MB_SETFOREGROUND);

return -1;

}

// Crear maneja la cadena ...

g_hszAppName = DdeCreateStringHandle (g_idInst, "DdemlSvr", NULL);

g_hszTopicName = DdeCreateStringHandle (g_idInst, "MyTopic", NULL);

g_hszItemName = DdeCreateStringHandle (g_idInst, "MyItem", NULL);

if ((g_hszAppName == 0) || (g_hszTopicName == 0) || (g_hszItemName == 0)) {

MessageBox(NULL, "DdeCreateStringHandle() failed", "Error", MB_SETFOREGROUND);

volver -2;

}

// Servidor DDE Registro

if (! DdeNameService (g_idInst, g_hszAppName, NULL, DNS_REGISTER)) {

MessageBox(NULL, "DdeNameService() failed!", "Error", MB_SETFOREGROUND);

volver -3;

}

// Crear un temporizador para simular los datos cambiantes ...

SetTimer (0,0,1,0);

// Bucle de mensajes:

MSG MSG;

mientras que (GetMessage (y msg, NULL, 0, 0)) {

// On WM_TIMER, change our counter, and update clients...

si (== msg.message WM_TIMER) {

g_count ++;

DdePostAdvise (g_idInst, g_hszTopicName, g_hszItemName);

}

TranslateMessage (y msg);

DispatchMessage (y msg);

}

volver msg.wParam;

}

// Nuestra función de devolución de llamada DDE ...

HDDEDATA EXPENTRY DdeCallback (UINT wType, FMT UINT, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2) {

interruptor (wType) {

// ------------------------------------------------ ----------------

XTYP_CONNECT caso:

// Client is trying to connect. Respond TRUE if we have what they want...

if ((! DdeCmpStringHandles (hsz1, g_hszTopicName)) &&

(! DdeCmpStringHandles (hsz2, g_hszAppName)))

volver (HDDEDATA) TRUE; // Servidor soporta Tema | Servicio

más

falso retorno; // Servidor no soporta Tema | Servicio

// ------------------------------------------------ ----------------

XTYP_ADVSTART caso:

// Client starting advisory loop.

// Say "ok" si tenemos lo que están pidiendo ...

if ((! DdeCmpStringHandles (hsz1, g_hszTopicName)) &&

(! DdeCmpStringHandles (hsz2, g_hszItemName)))

volver (HDDEDATA) TRUE; // Servidor soporta Tema | Servicio

más

falso retorno; // Servidor no soporta Tema | Servicio

// ------------------------------------------------ ----------------

XTYP_ADVREQ caso:

// Client wants our data. Since this is specific to Excel, we'll

// Seguir adelante y asuma que ellos quieren de datos con formato XlTable. Para

// Servidor DDE genérica, es posible que desee manejar varios formatos

// Especificado por el pasado en el parámetro FMT.

if (! DdeCmpStringHandles (hsz1, g_hszTopicName) &&

! DdeCmpStringHandles (hsz2, g_hszItemName)) {

xltableData corta [100];

// Registro tdtTable ...

xltableData [0] = 0x0010; // tdtTable

xltableData [1] = 4; // 2 enteros cortos siguientes

xltableData [2] = 1; // # Filas

xltableData [3] = 1; // # cols

// Registro tdtInt ...

xltableData [4] = 0x0006;

xltableData [5] = 2;

xltableData [6] = g_count (corto);

volver DdeCreateDataHandle (g_idInst, (UCHAR *) xltableData, 2 * 7, 0, g_hszItemName, FMT, 0);

}

// ------------------------------------------------ ----------------

defecto:

return (HDDEDATA)NULL;

}

}

5 Pegar el código en el archivo "main.cpp" que ha creado.

6 Compilar y luego poner en marcha el proyecto.

Prueba de su servidor

7 Pulse la tecla "Ctrl" + "Shift" + "Esc" para abrir el Administrador de tareas de Windows, a continuación, seleccione la pestaña "Procesos".

8 Asegúrese de que "DdemlSvr.exe" es una de las aplicaciones que se ejecutan en la lista.

9 La puesta en marcha de Microsoft Office Excel y escriba "= DdemlSvr |! MyTopic MyItem" en una célula. La célula debe contener ahora el valor creciente de la g_count.

Utilizar el servidor de forma remota

10 Ejecutar el "DdemlSvr.exe" en un equipo con Windows NT 4.0 que está conectado en red. A continuación, iniciar "DdeShare" de la línea de comandos.

11 Haga clic en "Acciones" en el menú que aparece, a continuación, "Acciones DDE," seguido de "Agregar un recurso compartido."

12 Introduzca los siguientes valores por debajo de "Nombre de aplicación":

Nombre de la acción: $ MyShare

Viejo estilo: DdemlSvr.DDE

Nuevo Estilo: DdemlSvr.OLE

Estática: DdemlSvr

13 Enter "MyTopic" en las tres cajas bajo "Nombre del tema." Seleccione "OK".

14 Haga clic en "MyShare $" y luego "Confianza Compartir", entonces el "iniciado con la Solicitud de Activar" casilla de verificación. Seleccione "OK" en todos los cuadros de diálogo y salga "DdeShare."

15 Ejecutar Excel en una máquina diferente de Windows NT 4.0, pero aún en la misma red.

dieciséis Copia el siguiente:

= '\ SERVERNAME \ NDDE $' | 'MyShare $' MyItem

17 Pegar lo que copió en una celda en Excel. Reemplazar "SERVERNAME" con el nombre de su servidor de red. Debería ver un número cada vez mayor en la célula.