/****************************** 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 #include #define DDEMLDB #include #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);