729 lines
24 KiB
C
729 lines
24 KiB
C
/****************************** Module Header ******************************\
|
|
* Module Name: DDEMLP.H
|
|
*
|
|
* Private header for DDE manager DLL.
|
|
*
|
|
* Created: 12/16/88 by Sanford Staab
|
|
* Modified for Win 3.0: 5/31/90 by Rich Gartland, Aldus
|
|
* Cleaned up: 11/14/90 Sanford Staab
|
|
*
|
|
* Copyright (c) 1988, 1989 Microsoft Corporation
|
|
* Copyright (c) 1990 Aldus Corporation
|
|
\***************************************************************************/
|
|
#define NOGDICAPMASKS
|
|
#define NOVIRTUALKEYCODES
|
|
#define NOSYSMETRICS
|
|
#define NOKEYSTATES
|
|
#define OEMRESOURCE
|
|
#define NOCOLOR
|
|
// #define NOCTLMGR
|
|
#define NODRAWTEXT
|
|
// #define NOMETAFILE
|
|
#define NOMINMAX
|
|
#define NOSCROLL
|
|
#define NOSOUND
|
|
#define NOCOMM
|
|
#define NOKANJI
|
|
#define NOHELP
|
|
#define NOPROFILER
|
|
|
|
|
|
#include <windows.h>
|
|
#include <dde.h>
|
|
|
|
#define DDEMLDB
|
|
#include <ddeml.h>
|
|
|
|
#ifdef DEBUG
|
|
extern int bDbgFlags;
|
|
#define DBF_STOPONTRACE 0x01
|
|
#define DBF_TRACETERM 0x02
|
|
#define DBF_LOGALLOCS 0x04
|
|
#define DBF_TRACEATOMS 0x08
|
|
#define DBF_TRACEAPI 0x10
|
|
|
|
#define TRACETERM(x) if (bDbgFlags & DBF_TRACETERM) { \
|
|
char szT[100]; \
|
|
wsprintf##x; \
|
|
OutputDebugString(szT); \
|
|
if (bDbgFlags & DBF_STOPONTRACE) { \
|
|
DebugBreak(); \
|
|
} \
|
|
}
|
|
#define TRACETERMBREAK(x) if (bDbgFlags & DBF_TRACETERM) { \
|
|
char szT[100]; \
|
|
wsprintf##x; \
|
|
OutputDebugString(szT); \
|
|
DebugBreak(); \
|
|
}
|
|
|
|
VOID TraceApiIn(LPSTR psz);
|
|
#define TRACEAPIIN(x) if (bDbgFlags & DBF_TRACEAPI) { \
|
|
char szT[100]; \
|
|
wsprintf##x; \
|
|
TraceApiIn(szT); \
|
|
}
|
|
|
|
VOID TraceApiOut(LPSTR psz);
|
|
#define TRACEAPIOUT(x) if (bDbgFlags & DBF_TRACEAPI) { \
|
|
char szT[100]; \
|
|
wsprintf##x; \
|
|
TraceApiOut(szT); \
|
|
}
|
|
#else
|
|
#define TRACETERM(x)
|
|
#define TRACETERMBREAK(x)
|
|
#define TRACEAPIIN(x)
|
|
#define TRACEAPIOUT(x)
|
|
#endif
|
|
|
|
// PRIVATE CONSTANTS
|
|
|
|
#define CBF_MASK 0x003ff000L
|
|
#define CBF_MONMASK 0x0027f000L
|
|
|
|
#define ST_TERM_WAITING 0x8000
|
|
#define ST_NOTIFYONDEATH 0x4000
|
|
#define ST_PERM2DIE 0x2000
|
|
#define ST_IM_DEAD 0x1000
|
|
#define ST_DISC_ATTEMPTED 0x0800
|
|
#define ST_CHECKPARTNER 0x0400
|
|
|
|
#define DDEFMT_TEXT CF_TEXT
|
|
|
|
#define TID_TIMEOUT 1
|
|
#define TID_SHUTDOWN 2
|
|
#define TID_EMPTYPOSTQ 4
|
|
|
|
#define TIMEOUT_QUEUECHECK 200
|
|
|
|
//
|
|
// values for pai->wTimeoutStatus
|
|
//
|
|
#define TOS_CLEAR 0x00
|
|
#define TOS_TICK 0x01
|
|
#define TOS_ABORT 0x02
|
|
#define TOS_DONE 0x80
|
|
|
|
#define GWL_PCI 0 // ties conv windows to data.
|
|
#define GWW_PAI 0 // other windows have pai here.
|
|
#define GWW_CHECKVAL 4 // for verification of hwnds.
|
|
#define GWW_STATE 6 // conv list state
|
|
|
|
#define MH_INTCREATE 5
|
|
#define MH_INTKEEP 6
|
|
#define MH_INTDELETE 7
|
|
|
|
// MACROS
|
|
|
|
#define MAKEHCONV(hwnd) (IsWindow(hwnd) ? hwnd | ((DWORD)GetWindowWord(hwnd, GWW_CHECKVAL) << 16) : 0)
|
|
#define UNUSED
|
|
#define max(a,b) (((a) > (b)) ? (a) : (b))
|
|
#define min(a,b) (((a) < (b)) ? (a) : (b))
|
|
#define PHMEM(hData) ((LPBYTE)&((LPWORD)&(hData))[1])
|
|
#define MONHSZ(a, fsAction, hTask) if (cMonitor) MonHsz(a, fsAction, hTask)
|
|
#define MONERROR(pai, e) MonError(pai, e)
|
|
#define MONLINK(pai, fEst, fNoData, hszSvc, hszTopic, hszItem, wFmt, fServer, hConvS, hConvC) \
|
|
if (cMonitor) \
|
|
MonLink(pai, fEst, fNoData, hszSvc, hszTopic, \
|
|
hszItem, wFmt, fServer, hConvS, hConvC)
|
|
#define MONCONN(pai, hszSvcInst, hszTopic, hwndC, hwndS, fConnect) \
|
|
if (cMonitor) \
|
|
MonConn(pai, hszSvcInst, hszTopic, hwndC, hwndS, fConnect)
|
|
|
|
#define SETLASTERROR(pai, e) MonError(pai, e)
|
|
#define SEMCHECKIN()
|
|
#define SEMCHECKOUT()
|
|
#define SEMENTER()
|
|
#define SEMLEAVE()
|
|
#define SEMINIT()
|
|
|
|
#ifdef DEBUG
|
|
|
|
VOID _loadds fAssert(BOOL f, LPSTR psz, WORD line, LPSTR szFile, BOOL fWarning);
|
|
#define AssertF(f, psz) fAssert(f, psz, __LINE__, __FILE__, FALSE);
|
|
#define AssertFW(f, psz) fAssert(f, psz, __LINE__, __FILE__, TRUE);
|
|
#define DEBUGBREAK() DebugBreak()
|
|
#define GLOBALREALLOC LogGlobalReAlloc
|
|
#define GLOBALALLOC LogGlobalAlloc
|
|
#define GLOBALFREE LogGlobalFree
|
|
#define GLOBALLOCK LogGlobalLock
|
|
#define GLOBALUNLOCK LogGlobalUnlock
|
|
#include "heapwach.h"
|
|
|
|
#else
|
|
|
|
#define AssertF(f, psz)
|
|
#define AssertFW(f, psz)
|
|
#define DEBUGBREAK()
|
|
#define GLOBALREALLOC GlobalReAlloc
|
|
#define GLOBALALLOC GlobalAlloc
|
|
#define GLOBALFREE GlobalFree
|
|
#define GLOBALLOCK GlobalLock
|
|
#define GLOBALUNLOCK GlobalUnlock
|
|
|
|
#endif /* DEBUG */
|
|
#define GLOBALPTR(h) (LPVOID)MAKELONG(0,h)
|
|
|
|
|
|
typedef ATOM GATOM;
|
|
typedef ATOM LATOM;
|
|
|
|
// -------------- LISTS --------------
|
|
|
|
|
|
typedef struct _LITEM { // generic list item
|
|
struct _LITEM FAR *next;
|
|
} LITEM;
|
|
typedef LITEM FAR *PLITEM;
|
|
|
|
typedef struct _LST { // generic list header
|
|
PLITEM pItemFirst;
|
|
HANDLE hheap;
|
|
WORD cbItem;
|
|
} LST;
|
|
typedef LST FAR *PLST;
|
|
|
|
#define ILST_LAST 0x0000 // flags for list lookups
|
|
#define ILST_FIRST 0x0001
|
|
#define ILST_NOLINK 0x0002
|
|
|
|
|
|
typedef struct _HSZLI { // HSZ list item
|
|
PLITEM next;
|
|
ATOM a;
|
|
} HSZLI;
|
|
|
|
typedef struct _HWNDLI { // HWND list item
|
|
PLITEM next;
|
|
HWND hwnd;
|
|
} HWNDLI;
|
|
|
|
typedef struct _ACKHWNDLI { // extra ACK list item
|
|
PLITEM next;
|
|
HWND hwnd; // same as HWNDLI to here
|
|
HSZ hszSvc;
|
|
HSZ aTopic;
|
|
} ACKHWNDLI;
|
|
|
|
typedef struct _HWNDHSZLI { // HWND-HSZ pair list item
|
|
PLITEM next;
|
|
ATOM a; // same as HSZLI to here
|
|
HWND hwnd;
|
|
} HWNDHSZLI;
|
|
typedef HWNDHSZLI FAR *PHWNDHSZLI;
|
|
|
|
typedef struct _ADVLI { // ADVISE loop list item
|
|
PLITEM next;
|
|
ATOM aItem; // same as HSZLI to here
|
|
ATOM aTopic;
|
|
WORD wFmt;
|
|
WORD fsStatus; // used to remember NODATA and FACKREQ state */
|
|
HWND hwnd; // hwnd that has advise loop
|
|
} ADVLI;
|
|
typedef ADVLI FAR *PADVLI;
|
|
|
|
|
|
|
|
// ------------ PILES -------------
|
|
|
|
|
|
typedef struct _PILEB { // generic pile block header
|
|
struct _PILEB FAR *next; // same as LITEM structure
|
|
WORD cItems;
|
|
WORD reserved;
|
|
} PILEB;
|
|
typedef PILEB FAR *PPILEB;
|
|
|
|
typedef struct PILE { // generic pile header
|
|
PPILEB pBlockFirst;
|
|
HANDLE hheap;
|
|
WORD cbBlock; // same as LST structure
|
|
WORD cSubItemsMax;
|
|
WORD cbSubItem;
|
|
} PILE;
|
|
typedef PILE FAR *PPILE;
|
|
|
|
typedef BOOL (*NPFNCMP)(LPBYTE, LPBYTE); // item comparison function pointer
|
|
|
|
#define PTOPPILEITEM(p) ((LPBYTE)p->pBlockFirst + sizeof(PILEB))
|
|
|
|
#define FPI_DELETE 0x1 // pile search flags
|
|
#define FPI_COUNT 0x2
|
|
|
|
#define API_ADDED 1 // AddPileItem flags
|
|
#define API_FOUND 2
|
|
#define API_ERROR 0
|
|
|
|
typedef struct _DIP { /* Data handle tracking pile */
|
|
HANDLE hData; /* the handle to the data */
|
|
HANDLE hTask; /* task owning the data */
|
|
WORD cCount; /* use count = # datapiles using the handle */
|
|
WORD fFlags; /* readonly, etc. */
|
|
} DIP;
|
|
|
|
|
|
typedef struct _LAP { /* Lost Ack Pile item */
|
|
WORD object; /* either a handle or an atom */
|
|
WORD type; /* transaction type the ack was meant for */
|
|
} LAP;
|
|
|
|
|
|
/*
|
|
* These bits are used to keep track of advise loop states.
|
|
*/
|
|
#define ADVST_WAITING 0x0080 /* fReserved bit - set if still waiting for FACK */
|
|
#define ADVST_CHANGED 0x0040 /* fReserved bit - set if data changed while waiting */
|
|
|
|
|
|
|
|
// ------------ QUEUES -------------
|
|
|
|
|
|
typedef struct _QUEUEITEM { // generic queue item
|
|
struct _QUEUEITEM FAR *next;
|
|
struct _QUEUEITEM FAR *prev;
|
|
WORD inst;
|
|
} QUEUEITEM;
|
|
typedef QUEUEITEM FAR *PQUEUEITEM;
|
|
|
|
typedef struct _QST { // generic queue header
|
|
WORD cItems;
|
|
WORD instLast;
|
|
WORD cbItem;
|
|
HANDLE hheap;
|
|
PQUEUEITEM pqiHead;
|
|
} QST;
|
|
typedef QST FAR *PQST;
|
|
|
|
#define MAKEID(pqd) (LOWORD((DWORD)pqd) + ((DWORD)((pqd)->inst) << 16))
|
|
#define PFROMID(pQ, id) ((PQUEUEITEM)MAKELONG(LOWORD(id), HIWORD(pQ)))
|
|
|
|
#define QID_NEWEST -2L
|
|
#define QID_OLDEST 0L
|
|
|
|
|
|
// ------------- STRUCTURES -------------
|
|
|
|
typedef struct _PMQI { // post message queue
|
|
PQUEUEITEM FAR *next;
|
|
PQUEUEITEM FAR *prev;
|
|
WORD inst; // same as QUEUEITEM to here!
|
|
WORD msg;
|
|
LONG lParam;
|
|
WORD wParam;
|
|
HWND hwndTo;
|
|
HGLOBAL hAssoc;
|
|
WORD msgAssoc;
|
|
} PMQI;
|
|
typedef PMQI FAR *PPMQI;
|
|
|
|
typedef struct _MQL { // message queue list
|
|
struct _MQL FAR*next;
|
|
HANDLE hTaskTo;
|
|
PQST pMQ;
|
|
} MQL, FAR *LPMQL;
|
|
|
|
typedef struct _XFERINFO { // DdeClientTransaction parameters reversed!!!
|
|
LPDWORD pulResult; // sync->flags, async->ID
|
|
DWORD ulTimeout;
|
|
WORD wType;
|
|
WORD wFmt;
|
|
HSZ hszItem;
|
|
HCONV hConvClient;
|
|
DWORD cbData;
|
|
HDDEDATA hDataClient;
|
|
} XFERINFO;
|
|
typedef XFERINFO FAR *PXFERINFO;
|
|
|
|
typedef struct _XADATA { // internal transaction specif info
|
|
WORD state; // state of this transaction (XST_)
|
|
WORD LastError; // last error logged in this transaction
|
|
DWORD hUser; // set with DdeSetUserHandle
|
|
PXFERINFO pXferInfo; // associated transaction info
|
|
DWORD pdata; // data for the client from the server
|
|
WORD DDEflags; // DDE flags resulting from transaction
|
|
BOOL fAbandoned; // set if this transaction is abandoned.
|
|
} XADATA;
|
|
typedef XADATA FAR *PXADATA;
|
|
|
|
typedef struct _CQDATA { // Client transaction queue
|
|
PQUEUEITEM FAR *next;
|
|
PQUEUEITEM FAR *prev;
|
|
WORD inst;
|
|
XADATA xad;
|
|
XFERINFO XferInfo;
|
|
} CQDATA;
|
|
typedef CQDATA FAR *PCQDATA;
|
|
|
|
typedef struct _APPINFO { // App wide information
|
|
struct _APPINFO *next; // local heap object
|
|
WORD cZombies; // number of hwnd's awaiting terminates
|
|
PFNCALLBACK pfnCallback; // callback address
|
|
PPILE pAppNamePile; // registered service names list
|
|
PPILE pHDataPile; // data handles not freed
|
|
PPILE pHszPile; // hsz cleanup tracking pile.
|
|
HWND hwndSvrRoot; // root of all server windows.
|
|
PLST plstCB; // callback queue
|
|
DWORD afCmd; // app filter and command flags
|
|
HANDLE hTask; // app task
|
|
HANDLE hheapApp; // app heap
|
|
HWND hwndDmg; // main app window
|
|
HWND hwndFrame; // main app initiate window
|
|
HWND hwndMonitor; // monitor window
|
|
HWND hwndTimer; // current timer window
|
|
WORD LastError; // last error
|
|
WORD wFlags; // set to ST_BLOCKED or not.
|
|
WORD cInProcess; // recursion guard
|
|
WORD instCheck; // to validate idInst param.
|
|
PLST pServerAdvList; // active ADVISE loops for servers
|
|
LPSTR lpMemReserve; // reserve memory in case of crunch
|
|
WORD wTimeoutStatus; // used to alert timeout modal loop
|
|
} APPINFO;
|
|
typedef APPINFO *PAPPINFO; // local heap object
|
|
typedef APPINFO FAR *LPAPPINFO;
|
|
typedef PAPPINFO FAR *LPPAPPINFO;
|
|
|
|
#define LPCREATESTRUCT_GETPAI(lpcs) (*((LPPAPPINFO)(((LPCREATESTRUCT)lpcs)->lpCreateParams)))
|
|
|
|
// defines for wFlags field
|
|
|
|
#define AWF_DEFCREATESTATE 0x0001
|
|
#define AWF_INSYNCTRANSACTION 0x0002
|
|
#define AWF_UNINITCALLED 0x0004
|
|
#define AWF_INPOSTDDEMSG 0x0008
|
|
|
|
#define CB_RESERVE 256 // size of memory reserve block
|
|
|
|
typedef struct _COMMONINFO { // Common (client & server) Conversation info
|
|
PAPPINFO pai; // associated app info
|
|
HSZ hszSvcReq; // app name used to make connection
|
|
ATOM aServerApp; // app name returned by server
|
|
ATOM aTopic; // conversation topic returned by server
|
|
HCONV hConvPartner; // conversation partner window
|
|
XADATA xad; // synchronous transaction data
|
|
WORD fs; // conversation status (ST_ flags)
|
|
HWND hwndFrame; // initiate window used to make connection
|
|
CONVCONTEXT CC; // conversation context values
|
|
PQST pPMQ; // post message queue - if needed.
|
|
} COMMONINFO;
|
|
typedef COMMONINFO far *PCOMMONINFO;
|
|
|
|
typedef struct _CBLI { /* callback list item */
|
|
PLITEM next;
|
|
HCONV hConv; /* perameters for callback */
|
|
HSZ hszTopic;
|
|
HSZ hszItem;
|
|
WORD wFmt;
|
|
WORD wType;
|
|
HDDEDATA hData;
|
|
DWORD dwData1;
|
|
DWORD dwData2;
|
|
WORD msg; /* message received that created this item */
|
|
WORD fsStatus; /* Status from DDE msg */
|
|
HWND hwndPartner;
|
|
PAPPINFO pai;
|
|
HANDLE hMemFree; /* used for holding memory to free after callback */
|
|
BOOL fQueueOnly; /* used to properly order replies to non-callback cases. */
|
|
} CBLI;
|
|
typedef CBLI FAR *PCBLI;
|
|
|
|
typedef struct _CLIENTINFO { /* Client specific conversation info */
|
|
COMMONINFO ci;
|
|
HWND hwndInit; // frame window last INITIATE was sent to.
|
|
PQST pQ; // assync transaction queue
|
|
PLST pClientAdvList; // active ADVISE loops for client
|
|
} CLIENTINFO;
|
|
typedef CLIENTINFO FAR *PCLIENTINFO;
|
|
|
|
typedef struct _SERVERINFO { /* Server specific conversation info */
|
|
COMMONINFO ci;
|
|
} SERVERINFO;
|
|
typedef SERVERINFO FAR *PSERVERINFO;
|
|
|
|
typedef struct _EXTDATAINFO { /* used to tie instance info to hDatas */
|
|
PAPPINFO pai;
|
|
HDDEDATA hData;
|
|
} EXTDATAINFO;
|
|
typedef EXTDATAINFO FAR *LPEXTDATAINFO;
|
|
|
|
#define EXTRACTHCONVPAI(hConv) ((PCLIENTINFO)GetWindowLong((HWND)hConv, GWL_PCI))->ci.pai
|
|
#define EXTRACTHCONVLISTPAI(hcl) (PAPPINFO)GetWindowWord((HWND)hcl, GWW_PAI)
|
|
#define EXTRACTHDATAPAI(XhData) ((LPEXTDATAINFO)(XhData))->pai
|
|
#define FREEEXTHDATA(XhData) FarFreeMem((LPSTR)XhData);
|
|
|
|
typedef struct _DDE_DATA {
|
|
WORD wStatus;
|
|
WORD wFmt;
|
|
WORD wData;
|
|
} DDE_DATA, FAR *LPDDE_DATA;
|
|
|
|
|
|
/******** structure for hook functions *******/
|
|
|
|
typedef struct _HMSTRUCT {
|
|
WORD hlParam;
|
|
WORD llParam;
|
|
WORD wParam;
|
|
WORD wMsg;
|
|
WORD hWnd;
|
|
} HMSTRUCT, FAR *LPHMSTRUCT;
|
|
|
|
|
|
typedef struct _IE { // InitEnum structure used to pass data to the fun.
|
|
HWND hwnd;
|
|
PCLIENTINFO pci;
|
|
ATOM aTopic;
|
|
} IE;
|
|
|
|
/***** private window messages and constants ******/
|
|
|
|
#define HDATA_READONLY 0x8000
|
|
#define HDATA_NOAPPFREE 0x4000 // set on loaned handles (callback)
|
|
#define HDATA_EXEC 0x0100 // this data was from execute
|
|
|
|
#define UMSR_POSTADVISE (WM_USER + 104)
|
|
#define UMSR_CHGPARTNER (WM_USER + 107)
|
|
|
|
#define UM_REGISTER (WM_USER + 200)
|
|
#define UM_UNREGISTER (WM_USER + 201)
|
|
#define UM_MONITOR (WM_USER + 202)
|
|
#define UM_QUERY (WM_USER + 203)
|
|
#define Q_CLIENT 0
|
|
#define Q_APPINFO 1
|
|
#define UM_CHECKCBQ (WM_USER + 204)
|
|
#define UM_DISCONNECT (WM_USER + 206)
|
|
#define UM_SETBLOCK (WM_USER + 207)
|
|
#define UM_FIXHEAP (WM_USER + 208)
|
|
#define UM_TERMINATE (WM_USER + 209)
|
|
|
|
|
|
// GLOBALS
|
|
|
|
extern HANDLE hInstance;
|
|
extern HWND hwndDmgMonitor;
|
|
extern HANDLE hheapDmg;
|
|
extern PAPPINFO pAppInfoList;
|
|
extern PPILE pDataInfoPile;
|
|
extern PPILE pLostAckPile;
|
|
extern WORD hwInst;
|
|
extern DWORD aulmapType[];
|
|
extern CONVCONTEXT CCDef;
|
|
extern char szNull[];
|
|
extern WORD cMonitor;
|
|
extern FARPROC prevMsgHook;
|
|
extern FARPROC prevCallHook;
|
|
extern DWORD ShutdownTimeout;
|
|
extern DWORD ShutdownRetryTimeout;
|
|
extern LPMQL gMessageQueueList;
|
|
|
|
extern char SZFRAMECLASS[];
|
|
extern char SZDMGCLASS[];
|
|
extern char SZCLIENTCLASS[];
|
|
extern char SZSERVERCLASS[];
|
|
extern char SZMONITORCLASS[];
|
|
extern char SZCONVLISTCLASS[];
|
|
extern char SZHEAPWATCHCLASS[];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#ifdef DEBUG
|
|
extern WORD cAtoms;
|
|
//#endif
|
|
|
|
// PROGMAN HACK!!!!
|
|
extern ATOM aProgmanHack;
|
|
|
|
// PROC DEFS
|
|
|
|
/* from dmgutil.asm */
|
|
|
|
LPBYTE NEAR HugeOffset(LPBYTE pSrc, DWORD cb);
|
|
#ifdef DEBUG
|
|
VOID StkTrace(WORD cFrames, LPVOID lpBuf);
|
|
#endif
|
|
extern WORD NEAR SwitchDS(WORD newDS);
|
|
|
|
/* dmg.c entrypoints are exported by ddeml.h */
|
|
|
|
/* from ddeml.c */
|
|
|
|
WORD Register(LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd);
|
|
BOOL AbandonTransaction(HWND hwnd, PAPPINFO pai, DWORD id, BOOL fMarkOnly);
|
|
|
|
/* from dmgwndp.c */
|
|
|
|
VOID ChildMsg(HWND hwndParent, WORD msg, WORD wParam, DWORD lParam, BOOL fPost);
|
|
long EXPENTRY DmgWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
|
|
long EXPENTRY ClientWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
|
|
BOOL DoClientDDEmsg(PCLIENTINFO pci, HWND hwndClient, WORD msg, HWND hwndServer,
|
|
DWORD lParam);
|
|
BOOL fExpectedMsg(PXADATA pXad, DWORD lParam, WORD msg);
|
|
BOOL AdvanceXaction(HWND hwnd, PCLIENTINFO pci, PXADATA pXad,
|
|
DWORD lParam, WORD msg, LPWORD pErr);
|
|
VOID CheckCBQ(PAPPINFO pai);
|
|
VOID Disconnect(HWND hwnd, WORD afCmd, PCLIENTINFO pci);
|
|
VOID Terminate(HWND hwnd, HWND hwndFrom, PCLIENTINFO pci);
|
|
long EXPENTRY ServerWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
|
|
long EXPENTRY subframeWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
|
|
long EXPENTRY ConvListWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
|
|
HDDEDATA DoCallback(PAPPINFO pai, HCONV hConv, HSZ hszTopic, HSZ hszItem,
|
|
WORD wFmt, WORD wType, HDDEDATA hData, DWORD dwData1, DWORD dwData2);
|
|
|
|
/* from dmgdde.c */
|
|
|
|
BOOL timeout(PAPPINFO pai, DWORD ulTimeout, HWND hwndTimeout);
|
|
HANDLE AllocDDESel(WORD fsStatus, WORD wFmt, DWORD cbData);
|
|
BOOL MakeCallback(PCOMMONINFO pci, HCONV hConv, HSZ hszTopic, HSZ hszItem,
|
|
WORD wFmt, WORD wType, HDDEDATA hData, DWORD dwData1, DWORD dwData2,
|
|
WORD msg, WORD fsStatus, HWND hwndPartner, HANDLE hMemFree,
|
|
BOOL fQueueOnly);
|
|
BOOL PostDdeMessage(PCOMMONINFO pci, WORD msg, HWND hwndFrom, LONG lParam,
|
|
WORD msgAssoc, HGLOBAL hAssoc);
|
|
BOOL EmptyDDEPostQ(VOID);
|
|
void CALLBACK EmptyQTimerProc(HWND hwnd, UINT msg, UINT tid, DWORD dwTime);
|
|
|
|
/* from dmgmon.c */
|
|
|
|
//#ifdef DEBUG
|
|
long EXPENTRY DdePostHookProc(int nCode, WORD wParam, LPMSG lParam);
|
|
long EXPENTRY DdeSendHookProc(int nCode, WORD wParam, LPHMSTRUCT lParam);
|
|
VOID MonBrdcastCB(PAPPINFO pai, WORD wType, WORD wFmt, HCONV hConv,
|
|
HSZ hszTopic, HSZ hszItem, HDDEDATA hData, DWORD dwData1,
|
|
DWORD dwData2, DWORD dwRet);
|
|
VOID MonHsz(ATOM a, WORD fsAction, HANDLE hTask);
|
|
WORD MonError(PAPPINFO pai, WORD error);
|
|
VOID MonLink(PAPPINFO pai, BOOL fEstablished, BOOL fNoData, HSZ hszSvc,
|
|
HSZ hszTopic, HSZ hszItem, WORD wFmt, BOOL fServer,
|
|
HCONV hConvServer, HCONV hConvClient);
|
|
VOID MonConn(PAPPINFO pai, ATOM aApp, ATOM aTopic, HWND hwndClient,
|
|
HWND hwndServer, BOOL fConnect);
|
|
VOID MonitorBroadcast(HDDEDATA hData, WORD filter);
|
|
HDDEDATA allocMonBuf(WORD cb, WORD filter);
|
|
long EXPENTRY MonitorWndProc(HWND hwnd, WORD msg, WORD wParam, DWORD lParam);
|
|
//#endif
|
|
|
|
/* from dmghsz.c */
|
|
|
|
BOOL FreeHsz(ATOM a);
|
|
BOOL IncHszCount(ATOM a);
|
|
WORD QueryHszLength(HSZ hsz);
|
|
WORD QueryHszName(HSZ hsz, LPSTR psz, WORD cchMax);
|
|
ATOM FindAddHsz(LPSTR psz, BOOL fAdd);
|
|
HSZ MakeInstAppName(ATOM a, HWND hwndFrame);
|
|
|
|
|
|
/* from dmgdb.c */
|
|
|
|
PAPPINFO GetCurrentAppInfo(PAPPINFO);
|
|
VOID UnlinkAppInfo(PAPPINFO pai);
|
|
|
|
PLST CreateLst(HANDLE hheap, WORD cbItem);
|
|
VOID DestroyLst(PLST pLst);
|
|
VOID DestroyAdvLst(PLST pLst);
|
|
VOID CleanupAdvList(HWND hwndClient, PCLIENTINFO pci);
|
|
PLITEM FindLstItem(PLST pLst, NPFNCMP npfnCmp, PLITEM piSearch);
|
|
BOOL CmpWORD(LPBYTE pb1, LPBYTE pb2);
|
|
BOOL CmpHIWORD(LPBYTE pb1, LPBYTE pb2);
|
|
BOOL CmpDWORD(LPBYTE pb1, LPBYTE pb2);
|
|
PLITEM NewLstItem(PLST pLst, WORD afCmd);
|
|
BOOL RemoveLstItem(PLST pLst, PLITEM pi);
|
|
|
|
PPILE CreatePile(HANDLE hheap, WORD cbItem, WORD cItemsPerBlock);
|
|
PPILE DestroyPile(PPILE pPile);
|
|
WORD QPileItemCount(PPILE pPile);
|
|
LPBYTE FindPileItem(PPILE pPile, NPFNCMP npfnCmp, LPBYTE pbSearch, WORD afCmd);
|
|
WORD AddPileItem(PPILE pPile, LPBYTE pb, NPFNCMP npfncmp);
|
|
BOOL PopPileSubitem(PPILE pPile, LPBYTE pb);
|
|
|
|
VOID AddHwndHszList(ATOM a, HWND hwnd, PLST pLst);
|
|
VOID DestroyHwndHszList(PLST pLst);
|
|
HWND HwndFromHsz(ATOM a, PLST pLst);
|
|
|
|
BOOL CmpAdv(LPBYTE pb1, LPBYTE pb2);
|
|
WORD CountAdvReqLeft(register PADVLI pali);
|
|
BOOL AddAdvList(PLST pLst, HWND hwnd, ATOM aTopic, ATOM aItem, WORD fsStatus, WORD usFormat);
|
|
BOOL DeleteAdvList(PLST pLst, HWND hwnd, ATOM aTopic, ATOM aItem, WORD wFmt);
|
|
PADVLI FindAdvList(PLST pLst, HWND hwnd, ATOM aTopic, ATOM aItem, WORD wFmt);
|
|
PADVLI FindNextAdv(PADVLI padvli, HWND hwnd, ATOM aTopic, ATOM aItem);
|
|
|
|
VOID SemInit(VOID);
|
|
VOID SemCheckIn(VOID);
|
|
VOID SemCheckOut(VOID);
|
|
VOID SemEnter(VOID);
|
|
VOID SemLeave(VOID);
|
|
|
|
BOOL CopyHugeBlock(LPBYTE pSrc, LPBYTE pDst, DWORD cb);
|
|
BOOL DmgDestroyWindow(HWND hwnd);
|
|
BOOL ValidateHConv(HCONV hConv);
|
|
|
|
/* from dmgq.c */
|
|
|
|
PQST CreateQ(WORD cbItem);
|
|
BOOL DestroyQ(PQST pQ);
|
|
PQUEUEITEM Addqi(PQST pQ);
|
|
VOID Deleteqi(PQST pQ, DWORD id);
|
|
PQUEUEITEM Findqi(PQST pQ, DWORD id);
|
|
PQUEUEITEM FindNextQi(PQST pQ, PQUEUEITEM pqi, BOOL fDelete);
|
|
|
|
/* from dmgmem.c */
|
|
HANDLE DmgCreateHeap(WORD wSize);
|
|
HANDLE DmgDestroyHeap(HANDLE hheap);
|
|
LPVOID FarAllocMem(HANDLE hheap, WORD wSize);
|
|
VOID FarFreeMem(LPVOID lpMem);
|
|
VOID RegisterClasses(VOID);
|
|
// VOID UnregisterClasses(VOID);
|
|
#ifdef DEBUG
|
|
HGLOBAL LogGlobalReAlloc(HGLOBAL h, DWORD cb, UINT flags);
|
|
HGLOBAL LogGlobalAlloc(UINT flags, DWORD cb);
|
|
void FAR * LogGlobalLock(HGLOBAL h);
|
|
BOOL LogGlobalUnlock(HGLOBAL h);
|
|
HGLOBAL LogGlobalFree(HGLOBAL h);
|
|
VOID LogDdeObject(UINT msg, LONG lParam);
|
|
VOID DumpGlobalLogs(VOID);
|
|
#endif
|
|
|
|
/* from hData.c */
|
|
|
|
HDDEDATA PutData(LPBYTE pSrc, DWORD cb, DWORD cbOff, ATOM aItem, WORD wFmt,
|
|
WORD afCmd, PAPPINFO pai);
|
|
VOID FreeDataHandle(PAPPINFO pai, HDDEDATA hData, BOOL fInternal);
|
|
HDDEDATA DllEntry(PCOMMONINFO pcomi, HDDEDATA hData);
|
|
VOID XmitPrep(HDDEDATA hData, PAPPINFO pai);
|
|
HDDEDATA RecvPrep(PAPPINFO pai, HANDLE hMem, WORD afCmd);
|
|
HANDLE CopyDDEShareHandle(HANDLE hMem);
|
|
HBITMAP CopyBitmap(PAPPINFO pai, HBITMAP hbm);
|
|
HDDEDATA CopyHDDEDATA(PAPPINFO pai, HDDEDATA hData);
|
|
VOID FreeDDEData(HANDLE hMem, WORD wFmt);
|
|
|
|
|
|
/* from stdinit.c */
|
|
|
|
long ClientCreate(HWND hwnd, PAPPINFO pai);
|
|
HWND GetDDEClientWindow(PAPPINFO pai, HWND hwndParent, HWND hwndSend, HSZ hszSvc, ATOM aTopic, PCONVCONTEXT pCC);
|
|
BOOL FAR PASCAL InitEnum(HWND hwnd, IE FAR *pie);
|
|
HWND CreateServerWindow(PAPPINFO pai, ATOM aTopic, PCONVCONTEXT pCC);
|
|
VOID ServerFrameInitConv(PAPPINFO pai, HWND hwndFrame, HWND hwndClient, ATOM aApp, ATOM aTopic);
|
|
long ServerCreate(HWND hwnd, PAPPINFO pai);
|
|
BOOL ClientInitAck(HWND hwnd, PCLIENTINFO pci, HWND hwndServer,
|
|
ATOM aApp, ATOM aTopic);
|
|
|
|
|
|
/* from stdptcl.c */
|
|
|
|
long ClientXferReq(PXFERINFO pXferInfo, HWND hwnd, PCLIENTINFO pci);
|
|
WORD SendClientReq(PAPPINFO pai, PXADATA pXad, HWND hwndServer, HWND hwnd);
|
|
VOID ServerProcessDDEMsg(PSERVERINFO psi, WORD msg, HWND hwndServer,
|
|
HWND hwndClient, WORD lo, WORD hi);
|
|
VOID PostServerAdvise(HWND hwnd, PSERVERINFO psi, PADVLI pali, WORD cLoops);
|
|
VOID QReply(PCBLI pcbi, HDDEDATA hDataRet);
|
|
long ClientXferRespond(HWND hwndClient, PXADATA pXad, LPWORD pErr);
|
|
|
|
/* from register.c */
|
|
|
|
LRESULT ProcessRegistrationMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
VOID RegisterService(BOOL fRegister, GATOM gaApp, HWND hwndListen);
|