The client application includes the following files:
The following sample shows the client application code:
===============DDEC.C
===============
#define INCL_WIN
#define INCL_DOS
#include <os2.h>
#include <stdio.h>
#include "ddec.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, hServerWnd;
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 = DDEC;
/***********************************************************************/
/* Create the frame - it will hold the container control. */
/***********************************************************************/
hFrameWnd = WinCreateWindow(HWND_DESKTOP,
WC_FRAME,
"DDE Client",
0, 0, 0, 0, 0,
NULLHANDLE,
HWND_TOP,
DDEC,
&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 i.t */
/***********************************************************************/
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)
{
PSZ szData;
/* DDE strings */
PSZ szApp = "DDEdemo", szTopic = "System";
PSZ szInApp, szInTopic;
/* System-defined DDE structures */
CONVCONTEXT context;
PDDEINIT pDDEinit;
PDDESTRUCT pDDEdata;
/* Server process and thread IDs */
PID pid;
TID tid;
/* Pointer to memory we'll allocate */
ULONG mem;
switch(msg)
{
/* All answers to the WinDDEInitate call arrive here */
case WM_DDE_INITIATEACK:
pDDEinit = (PDDEINIT)mp2;
szInApp = pDDEinit->pszAppName;
szInTopic = pDDEinit->pszTopic;
ShowMessage("server answered...");
hServerWnd = (HWND)mp1;
break;
/* All answers to DDE requests arrive here */
case WM_DDE_DATA:
ShowMessage("data in");
pDDEdata = (PDDESTRUCT)mp2;
DosGetSharedMem(pDDEdata, PAG_READ | PAG_WRITE);
szData = (BYTE *)(pDDEdata+(pDDEdata->offabData));
ShowMessage(szData);
break;
/* Menu item processing */
case WM_COMMAND:
switch (SHORT1FROMMP(mp1))
{
/* User starts DDE conversation */
case IDM_POLL:
WinPostMsg(hListWnd, LM_DELETEALL, 0, 0);
ShowMessage("Polling...");
context.cb = sizeof(CONVCONTEXT);
context.fsContext = 0;
WinDdeInitiate(hwnd, szApp, szTopic, &context);
ShowMessage("Polling complete.");
break;
/* User requests data from the server */
case IDM_DATA:
/* 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(hServerWnd, &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 data structure */
/* (plus past the name) for the data */
pDDEdata->offabData = sizeof(DDESTRUCT)+11;
strcpy((BYTE *)(pDDEdata+(pDDEdata->offszItemName)),
"STATUS");
/* Post our request to the server program */
WinDdePostMsg(hServerWnd,
hwnd,
WM_DDE_REQUEST,
pDDEdata,
DDEPM_RETRY);
break;
/* User terminates the conversation */
case IDM_CLOSE:
WinDdePostMsg(hServerWnd,
hwnd,
WM_DDE_TERMINATE,
NULL,
DDEPM_RETRY);
break;
/* User closes the window */
case IDM_EXIT:
WinPostMsg(hwnd, WM_CLOSE, 0, 0);
break;
}
break;
/* Send the message to the usual WC_FRAME WndProc */
default:
return (*SysWndProc)(hwnd, msg, mp1, mp2);
break;
}
return FALSE;
}
/***********************************************************************/
/* ShowMessage(). */
/***********************************************************************/
void ShowMessage(PSZ szText)
{
WinPostMsg(hListWnd,
LM_INSERTITEM,
MPFROMSHORT(LIT_END),
szText);
}
===============
DDEC.RC
===============
#include <os2.h>
#include "ddec.h"
MENU DDEC
BEGIN
SUBMENU "Commands", IDM_MENU
BEGIN
MENUITEM "Initiate", IDM_POLL
MENUITEM "Data", IDM_DATA
MENUITEM "Close", IDM_CLOSE
MENUITEM "Exit", IDM_EXIT
END
END
===============
DDEC.H
===============
#define DDEC 100
#define IDM_MENU 101
#define IDM_POLL 102
#define IDM_INITIATE 103
#define IDM_DATA 104
#define IDM_CLOSE 105
#define IDM_EXIT 106
===============
DDEC.DEF
===============
NAME DDEC WINDOWAPI
DESCRIPTION 'PM DDE Client Sample'
CODE MOVEABLE
DATA MOVEABLE MULTIPLE
STACKSIZE 24576
HEAPSIZE 10240
PROTMODE
===============
DDEC.LNK
===============
ddec.obj
ddec.exe
ddec.map
ddec.def
===============
DDEC.MAK
===============
CC = icc /c /Ge /Gd- /Se /Re /ss /Gm+
LINK = link386
HEADERS = ddec.h
#-------------------------------------------------------------------
# A list of all of the object files.
#-------------------------------------------------------------------
ALL_OBJ1 = ddec.obj
all: ddec.exe
ddec.res: ddec.rc ddec.h
ddec.obj: ddec.c $(HEADERS)
ddec.exe: $(ALL_OBJ1) ddec.def ddec.lnk ddec.res
$(LINK) @ddec.lnk
rc -p -x ddec.res ddec.exe