The server application includes the following files:

The following sample shows the server application code:

===============DDES.C
===============

#define  INCL_WIN
#define  INCL_WINDDE
#define  INCL_DOS

#include <os2.h>
#include <stdio.h>
#include <string.h>
#include "ddes.h"

#pragma  linkage (main, optlink)
INT      main(VOID);
void     ShowMessage(PSZ);

/***********************************************************************/
/*  Main() - program entry point.                                      */
/***********************************************************************/
MRESULT EXPENTRY LocalWndProc(HWND, ULONG, MPARAM, MPARAM);

HAB     hab;
HWND    hFrameWnd, hListWnd, hClientWnd;
PFNWP   SysWndProc;

INT main (VOID)
{
    HMQ         hmq;
    FRAMECDATA  fcd;
    QMSG        qmsg;

    if (!(hab = WinInitialize(0)))
      return FALSE;

    if (!(hmq = WinCreateMsgQueue(hab, 0)))
      return FALSE;

/***********************************************************************/
/*  Setup the frame control data for the frame window.                 */
/***********************************************************************/
    fcd.cb = sizeof(FRAMECDATA);
    fcd.flCreateFlags = FCF_TITLEBAR        |
                        FCF_SYSMENU         |
                        FCF_MENU            |
                        FCF_SIZEBORDER      |
                        FCF_SHELLPOSITION   |
                        FCF_MINMAX          |
                        FCF_TASKLIST;

    fcd.hmodResources = NULLHANDLE;

/***********************************************************************/
/*  Set our resource key (so PM can find menus, icons, etc).           */
/***********************************************************************/
    fcd.idResources = DDES;

/***********************************************************************/
/*  Create the frame window.                                           */
/***********************************************************************/
    hFrameWnd = WinCreateWindow(HWND_DESKTOP,
                                WC_FRAME,
                                "DDE Server",
                                0, 0, 0, 0, 0,
                                NULLHANDLE,
                                HWND_TOP,
                                DDES,
                                &fcd,
                                NULL);

/***********************************************************************/
/*  Verify that the frame was created; otherwise, stop.                */
/***********************************************************************/
    if (!hFrameWnd)
      return FALSE;

/***********************************************************************/
/*  Set an icon for the frame window.                                  */
/***********************************************************************/
    WinSendMsg(hFrameWnd,
               WM_SETICON,
               (MPARAM)WinQuerySysPointer(HWND_DESKTOP,
                                          SPTR_FOLDER,
                                          FALSE),
               NULL);

/***********************************************************************/
/*  Create a list window child.                                        */
/***********************************************************************/
    hListWnd = WinCreateWindow(hFrameWnd,
                               WC_LISTBOX,
                               NULL,
                               LS_HORZSCROLL,
                               0, 0, 0, 0,
                               hFrameWnd,
                               HWND_BOTTOM,
                               FID_CLIENT,
                               NULL,
                               NULL);

/***********************************************************************/
/*  We must intercept the frame window's messages                      */
/*  (to capture any input from the container control).                 */
/*  We save the return value (the current WndProc),                    */
/*  so we can pass it all the other messages the frame gets.           */
/***********************************************************************/
    SysWndProc = WinSubclassWindow(hFrameWnd, (PFNWP)LocalWndProc);

    WinShowWindow(hFrameWnd, TRUE);

/***********************************************************************/
/*  Standard PM message loop - get it, dispatch it.                    */
/***********************************************************************/
    while (WinGetMsg(hab, &qmsg, NULLHANDLE, 0, 0))
    {
       WinDispatchMsg(hab, &qmsg);
    }

/***********************************************************************/
/*  Clean up on the way out.                                           */
/***********************************************************************/
    WinDestroyMsgQueue(hmq);
    WinTerminate(hab);

    return TRUE;
}

/***********************************************************************/
/*  LocalWndProc() - window procedure for the frame window.            */
/*  Called by PM whenever a message is sent to the frame.              */
/***********************************************************************/
MRESULT EXPENTRY LocalWndProc(HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
{
    /* Our inbound DDE stuff */
    PSZ         szClientApp;
    PSZ         szClientTopic;
    PSZ         szReqItem;

    /* Our supported DDE stuff */
    PSZ         szApp    = "DDEdemo";
    PSZ         szTopic  = "System";
    PSZ         szItem   = "Status";
    PSZ         szStatus = "RUNNING";

    /* System DDE structures */
    CONVCONTEXT context;
    PDDEINIT    pDDEinit;
    PDDESTRUCT  pDDEdata;

    /* Miscellaneous */
    PID         pid;
    TID         tid;
    PVOID       mem;

    switch(msg)
    {
        /* All WinDDEInitate calls arrive here */
        case WM_DDE_INITIATE:
           ShowMessage("init");
           hClientWnd = (HWND)mp1;
           pDDEinit = (PDDEINIT)mp2;

            /* Check incoming poll - if the App and Topic match,     */
            /* we must acknowledge. If both are NULL, the client is  */
            /* searching for anyone - send our names                 */
            szClientApp   = pDDEinit->pszAppName;
            szClientTopic = pDDEinit->pszTopic;
            ShowMessage(szClientApp);
            ShowMessage(szClientTopic);

            if (!strcmpi(szClientApp, szApp) ||
                !strcmpi(szClientApp, NULL))
            {
                if (!strcmpi(szClientTopic, szTopic) ||
                    !strcmpi(szClientTopic, NULL) )
                {
                    context.cb = sizeof(CONVCONTEXT);
                    context.fsContext = 0;
                    WinDdeRespond(hClientWnd,
                                  hwnd,
                                  szApp,
                                  szTopic,
                                  &context);
                }
            }
            break;

        /* Incoming DDE request - get the item name, send the data out. */
        case WM_DDE_REQUEST:
            ShowMessage("request in...");
            hClientWnd = (HWND)mp1;

            /* The DDE structure is passed, and           */
            /*  the client should have shared it with us  */
            pDDEdata  = (PDDESTRUCT)mp2;
            szReqItem = (BYTE *)(pDDEdata+(pDDEdata->offszItemName));
            ShowMessage(szReqItem);

            /* We support item status, but not anything else */
            if (!strcmpi(szReqItem, szItem))
            {
               ShowMessage("sending...");

               /* Get some sharable memory */
               DosAllocSharedMem((PVOID)&mem,
                                 NULL,
                                 sizeof(DDESTRUCT)+21,
                                 PAG_COMMIT |
                                 PAG_READ |
                                 PAG_WRITE |
                                 OBJ_GIVEABLE);

               /* Get the server's id and give it access */
               /* to the shared memory                   */
               WinQueryWindowProcess(hClientWnd, &pid, &tid);
               DosGiveSharedMem(&mem, pid, PAG_READ | PAG_WRITE);

               /* Setup DDE data structures                      */
               /* (11 byte name length, 10 plus NULL,            */
               /*  10 byte data length)                          */
               pDDEdata = (PDDESTRUCT)mem;
               pDDEdata->cbData   = 10;           /* Data length */
               pDDEdata->fsStatus = 0;            /* Status      */
               pDDEdata->usFormat = DDEFMT_TEXT;  /* Text format */

               /* Go past end of structure for the name */
               pDDEdata->offszItemName = sizeof(DDESTRUCT);

               /* Go past end of structure (and name) for the data  */
               pDDEdata->offabData = sizeof(DDESTRUCT)+11;
               strcpy((BYTE *)(pDDEdata+(pDDEdata->offabData)), szStatus);
               WinDdePostMsg(hClientWnd,
                             hwnd,
                             WM_DDE_DATA,
                             pDDEdata,
                             DDEPM_RETRY);
            }

            else
            {
               ShowMessage("rejecting...");
               pDDEdata->cbData   = 0;                /* Data length */
               pDDEdata->fsStatus = DDE_NOTPROCESSED; /* Status      */
               pDDEdata->usFormat = DDEFMT_TEXT;      /* Text format */
               WinDdePostMsg(hClientWnd,
                             hwnd,
                             WM_DDE_ACK,
                             pDDEdata,
                             DDEPM_RETRY);
            }
            ShowMessage("sent...");
            break;

            /* Menu item processing */
            case WM_COMMAND:
            switch (SHORT1FROMMP(mp1))
            {
               case IDM_EXIT:
                  WinPostMsg(hwnd, WM_CLOSE, 0, 0);
                  break;
               default:
                  return (*SysWndProc)(hwnd, msg, mp1, mp2);
                  break;
            }
            break;

            /* Send the message to the usual WC_FRAME WndProc */
            default:
               return (*SysWndProc)(hwnd, msg, mp1, mp2);
               break;
    }
    return (MRESULT)FALSE;
}

/***********************************************************************/
/*  ShowMessage().                                                     */
/***********************************************************************/
void ShowMessage(PSZ szText)
{
    WinPostMsg(hListWnd,
               LM_INSERTITEM,
               MPFROMSHORT(LIT_END),
               szText);
}

===============
DDES.RC
===============
#include <os2.h>
#include "ddes.h"

MENU    DDES
BEGIN
    SUBMENU       "Commands",  IDM_MENU
    BEGIN
        MENUITEM  "Exit",      IDM_EXIT
    END
END

===============
DDES.H
===============
#define DDES        100
#define IDM_MENU    1000
#define IDM_EXIT    1001

===============
DDES.DEF
===============
NAME      DDES WINDOWAPI

DESCRIPTION 'PM DDE Server Sample'

CODE      MOVEABLE
DATA      MOVEABLE MULTIPLE

STACKSIZE 24576
HEAPSIZE  10240

PROTMODE

===============
DDES.LNK
===============
ddes.obj
ddes.exe
ddes.map

ddes.def

===============
DDES.MAK
===============
CC      = icc /c /Ge /Gd- /Se /Re /ss /Gm+
LINK    = link386
HEADERS = ddes.h

#-------------------------------------------------------------------
#   A list of all of the object files.
#-------------------------------------------------------------------
ALL_OBJ1 = ddes.obj

all: ddes.exe

ddes.res: ddes.rc ddes.h

ddes.obj: ddes.c $(HEADERS)

ddes.exe: $(ALL_OBJ1) ddes.def ddes.lnk ddes.res
          $(LINK) @ddes.lnk
          rc -p -x ddes.res ddes.exe


[Back] [Next]