This sample contains two applications that demonstrate a DDEML server 
and DDEML client in MFC applications.  This sample defines four new 
classes to help implement the DDEML support.  These classes are:

   CDDEClient
   CDDEClientConv
   CDDEServer
   CDDEServerConv

The CDDEClient and CDDEServer classes encasulate the functionality of 
a DDEML client or server.  The CDDEClientConv and CDDEServerConv 
encapsulate individual conversations which are managed by the CDDEClient 
or CDDEServer classes.  The CDDEClient and CDDEServer classes maintian a 
map of the current conversations acording to the conversations handle.  
Using this map a the server or client can look up any ongoing conversation 
based on its handle.  

These classes were designed to implement DDEML in a very general way.  As 
a result, these classes don't do very much by themselves.  They are designed 
to be reused in an application by deriving from each of these classes.  
Typically, an application will derive one class from CDDEClient or CDDEServer.  
This derived class will contain details such as what conversations are 
supported, and how to handle callbacks that don't relate to a specific 
conversation.  Usually there is only one instance of this class in an 
application.   An application may derive many classes from CDDEClientConv or 
CDDEServerConv, depending on how many different types of conversations the 
application supports.  These derived classes implement how each conversion 
handles callbacks.  They also may contain buffers to store data from the 
conversation, or pointers to other objects that they need to comunicate with.  
This sample contains a client and server application built using the classes 
mentioned above.

One difficulty in writting DDEML classes, is how to handle the DDEML 
callback function.  In this sample, the DDEML callback function is 
containted in the CDDEClient or CDDEServer class.  The callback function 
first checks to see if the transaction is for the client or server, or for 
one of the conversations.  If it is for the client or server, then the 
callback function calls the member function that handles that transaction.  
If the transaction is for a conversation, the the callback function looks
up the pointer to the conversation object using the handle of the 
conversation in the conversation map.  Then it calls the member function 
of the conversation that handles that transaction.  Therefore, by using 
these classes, an application developer does not need to write a DDEML 
callback function.
