windows-nt/Source/XPSP1/NT/shell/osshell/games/mshearts/dde.h
2020-09-26 16:20:57 +08:00

129 lines
5 KiB
C++

/***************************************************************************/
/** Microsoft Windows **/
/** Copyright(c) Microsoft Corp., 1991, 1992 **/
/***************************************************************************/
/****************************************************************************
dde.h
Aug 92, JimH
Header file for DDE objects (DDEClient, and DDEServer.) DDE is not meant to
be instantiated directly.
Class DDE
This superclass requires both a server name and a topic name for which
it creates and destroys string handles. Servers technically do not
need the topic name to instantiate, but they generally need at least
one to do useful things, so it is provided here. Clients require the
topic name to connect. DDE also requires a dde callback function pointer.
Type DDECALLBACK is defined for this purpose.
DDE provides a convenient way to retrieve dde data from within
callback functions, especially string data in CString objects via
GetDataString(hData). Structures can also be retrieved, but in that
case memory must be allocated prior to the GetData() call.
Some built-in methods return a BOOL to determine success. Others (like
the constructor) cannot, so use GetResult() for current status. If it
is FALSE, GetLastError() can be useful.
Class DDEServer : DDE
This is a very simple extension. The contructor registers the server
name and the destructor unregisters it. Most of the work for DDEML
servers is done in the server callback function, not here.
Class DDEClient : DDE
This is used to instantiate a client-only DDE object. New methods
request new data (RequestString) set up hot links (StartAdviseLoop)
and send unsolicited data (Poke.)
****************************************************************************/
#ifndef DDE_INC
#define DDE_INC
#include <ddeml.h>
typedef HDDEDATA (EXPENTRY *DDECALLBACK) (WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD);
HDDEDATA EXPENTRY EXPORT DdeServerCallBack(WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD);
HDDEDATA EXPENTRY EXPORT DdeClientCallBack(WORD, WORD, HCONV, HSZ, HSZ, HDDEDATA, DWORD, DWORD);
class DDE
{
public:
DDE(const TCHAR *server, const TCHAR *topic, DDECALLBACK CallBack,
DWORD filters = APPCLASS_STANDARD);
virtual ~DDE();
HDDEDATA CreateDataHandle(void FAR *pdata, DWORD size, HSZ hItem);
HSZ CreateStrHandle(LPCTSTR str, int codepage = CP_WINANSI);
void DestroyStrHandle(HSZ hsz);
PBYTE GetData(HDDEDATA hData, PBYTE pdata, DWORD len = 0);
CString GetDataString(HDDEDATA hData = NULL);
WORD GetInitError() { return m_initerr; }
UINT GetLastError() { return ::DdeGetLastError(m_idInst); }
BOOL GetResult() { return m_bResult; }
CString GetServer() { return m_server; }
CString GetTopic() { return m_topic; }
BOOL SetCallBack(DDECALLBACK CallBack);
void SetFilters(DWORD filters) { m_filters = filters; }
private:
BOOL Initialize(void);
DDECALLBACK m_CallBack;
DWORD m_filters; // filters passed to ::DdeInitialize()
WORD m_initerr; // return error from ::DdeInitialize()
protected:
DWORD m_idInst; // instance id from ::DdeInitialize()
BOOL m_bResult; // current state of object
CString m_data; // last string acquired from GetDataString()
CString m_server, m_topic; // server and topic names
HSZ m_hServer, m_hTopic;
};
class DDEServer : public DDE
{
public:
DDEServer(const TCHAR *server, const TCHAR *topic,
DDECALLBACK ServerCallBack,
DWORD filters = APPCLASS_STANDARD);
~DDEServer(void);
BOOL PostAdvise(HSZ hItem);
};
class DDEClient : public DDE
{
public:
DDEClient(const TCHAR *server, const TCHAR *topic,
DDECALLBACK ClientCallBack,
DWORD filters = APPCMD_CLIENTONLY | CBF_FAIL_SELFCONNECTIONS);
~DDEClient(void);
BOOL Poke(HSZ hItem, const TCHAR *string, DWORD uTimeout = NULL);
BOOL Poke(HSZ hItem, void FAR *pdata, DWORD len,
DWORD uTimeout = NULL);
void SetTimeOut(DWORD timeout) { m_timeout = timeout; }
HDDEDATA RequestData(HSZ hItem, DWORD uTimeout = NULL);
BOOL RequestString(HSZ hItem, DWORD uTimeout = NULL);
BOOL StartAdviseLoop(HSZ hItem);
private:
HDDEDATA ClientTransaction(void FAR *lpvData, DWORD cbData, HSZ hItem,
UINT uType, UINT uFmt = CF_TEXT);
HCONV m_hConv; // conversation handle from ::DdeConnect()
DWORD m_timeout; // timeout used in ::DdeClientTransaction()
DWORD m_deftimeout; // default timeout
};
extern DDEClient *ddeClient;
extern DDEServer *ddeServer;
#endif