You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
444 lines
16 KiB
444 lines
16 KiB
/****************************** Module Header ******************************\
|
|
* Module Name: ddemlcli.h
|
|
*
|
|
* Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
*
|
|
* This header file contains stuff used by client side ddeml code.
|
|
*
|
|
* History:
|
|
* 10-28-91 Sanfords Created
|
|
\***************************************************************************/
|
|
#if DBG
|
|
#define DDEMLAlloc(cb) RtlAllocateHeap(gpDDEMLHeap, HEAP_ZERO_MEMORY, (cb))
|
|
#define DDEMLReAlloc(p, cb) RtlReAllocateHeap(gpDDEMLHeap, HEAP_ZERO_MEMORY, (p), (cb))
|
|
#define DDEMLFree(p) RtlFreeHeap(gpDDEMLHeap, 0, (p))
|
|
#else
|
|
#define DDEMLAlloc(cb) LocalAlloc(LPTR, cb)
|
|
#define DDEMLReAlloc(p, cb) LocalReAlloc(p, cb, LHND)
|
|
#define DDEMLFree(p) LocalFree(p);
|
|
#endif
|
|
|
|
|
|
// general typedefs
|
|
|
|
typedef ATOM LATOM;
|
|
typedef ATOM GATOM;
|
|
|
|
// monitor stuff ------------------------------------------
|
|
|
|
#define MONHSZ(pcii, hsz, type) if ((pcii->MonitorFlags & MF_HSZ_INFO) && hsz) \
|
|
MonitorStringHandle(pcii, hsz, type)
|
|
#define MONLINK(pcii, fEst, fNoD, aS, aT, aI, wFmt, fSvr, hConvS, hConvC) \
|
|
if (pcii->MonitorFlags & MF_LINKS) \
|
|
MonitorLink(pcii, fEst, fNoD, aS, aT, aI, \
|
|
wFmt, fSvr, hConvS, hConvC)
|
|
|
|
#define MONCONV(pcoi, fConn) \
|
|
if (((pcoi)->pcii->MonitorFlags & MF_CONV) && \
|
|
((((pcoi)->state & ST_ISLOCAL) && (pcoi)->state & ST_CLIENT) || \
|
|
!((pcoi)->state & ST_ISLOCAL))) \
|
|
MonitorConv(pcoi, fConn);
|
|
|
|
// critical section stuff ---------------------------------
|
|
|
|
extern RTL_CRITICAL_SECTION gcsDDEML;
|
|
#if DBG
|
|
extern PVOID gpDDEMLHeap;
|
|
#endif
|
|
#define EnterDDECrit RtlEnterCriticalSection(&gcsDDEML);
|
|
#define LeaveDDECrit RtlLeaveCriticalSection(&gcsDDEML);
|
|
#if DBG
|
|
#define CheckDDECritIn if (GetCurrentThreadId() != HandleToUlong(gcsDDEML.OwningThread)) { \
|
|
RIPMSG0(RIP_ERROR, "CheckDDECritIn failed"); \
|
|
}
|
|
#define CheckDDECritOut if (GetCurrentThreadId() == HandleToUlong(gcsDDEML.OwningThread)) { \
|
|
RIPMSG0(RIP_ERROR, "CheckDDECritoUT failed"); \
|
|
}
|
|
#else
|
|
#define CheckDDECritIn ;
|
|
#define CheckDDECritOut ;
|
|
#endif
|
|
|
|
// String handle stuff -------------------------------------
|
|
|
|
// return values for ValidateHSZ macro
|
|
#define HSZT_INVALID 0
|
|
#define HSZT_NORMAL 1
|
|
#define HSZT_INST_SPECIFIC 2
|
|
|
|
#define LATOM_FROM_HSZ(hsz) (LATOM)(ULONG_PTR)(hsz)
|
|
#define NORMAL_HSZ_FROM_LATOM(a) (HSZ)(ULONG_PTR)(a)
|
|
#define INST_SPECIFIC_HSZ_FROM_LATOM(a) (HSZ)LongToHandle( MAKELONG(a, 1) )
|
|
|
|
// Handle manager stuff ------------------------------------------
|
|
|
|
typedef struct tagCHANDLEENTRY {
|
|
HANDLE handle;
|
|
ULONG_PTR dwData;
|
|
} CHANDLEENTRY, *PCHANDLEENTRY;
|
|
|
|
typedef BOOL (*PFNHANDLEAPPLY)(HANDLE);
|
|
|
|
#define MASK_ID 0xFF000000 // 256 uniqueness
|
|
#define SHIFT_ID 24
|
|
#define MASK_INDEX 0x00FFFC00 // 16K handles per process max
|
|
#define SHIFT_INDEX 10
|
|
#define MASK_TYPE 0x00000380 // 8 types max
|
|
#define SHIFT_TYPE 7
|
|
#define MASK_INST 0x0000007F // 128 instances per process max
|
|
#define SHIFT_INST 0
|
|
#define MAX_INST MASK_INST
|
|
|
|
#define IdFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_ID) >> SHIFT_ID)
|
|
#define IndexFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_INDEX) >> SHIFT_INDEX)
|
|
#define TypeFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_TYPE) >> SHIFT_TYPE)
|
|
#define InstFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_INST) >> SHIFT_INST)
|
|
|
|
#define HandleFromId(h) (((DWORD)(h)) << SHIFT_ID)
|
|
#define HandleFromIndex(h) (((DWORD)(h)) << SHIFT_INDEX)
|
|
#define HandleFromType(h) (((DWORD)(h)) << SHIFT_TYPE)
|
|
#define HandleFromInst(h) (((DWORD)(h)) << SHIFT_INST)
|
|
|
|
#define HTYPE_EMPTY 0
|
|
#define HTYPE_INSTANCE 1
|
|
#define HTYPE_SERVER_CONVERSATION 2
|
|
#define HTYPE_CLIENT_CONVERSATION 3
|
|
#define HTYPE_CONVERSATION_LIST 4
|
|
#define HTYPE_TRANSACTION 5
|
|
#define HTYPE_DATA_HANDLE 6
|
|
#define HTYPE_ZOMBIE_CONVERSATION 7
|
|
|
|
#define HTYPE_ANY (DWORD)(-1)
|
|
#define HINST_ANY (DWORD)(-1)
|
|
|
|
// transaction stuff -------------------------------------------
|
|
|
|
typedef struct tagXACT_INFO *PXACT_INFO;
|
|
|
|
typedef BOOL (* FNRESPONSE)(PXACT_INFO, UINT, LPARAM);
|
|
|
|
typedef struct tagXACT_INFO {
|
|
struct tagXACT_INFO *next;
|
|
struct tagCONV_INFO *pcoi;
|
|
DWORD_PTR hUser;
|
|
HANDLE hXact;
|
|
FNRESPONSE pfnResponse;
|
|
GATOM gaItem;
|
|
WORD wFmt;
|
|
WORD wType; // for DdeQueryConvInfo only
|
|
WORD wStatus; // see DDE_F flags
|
|
WORD flags; // see XIF_ flags
|
|
WORD state; // see XST_ state values (ddeml.h)
|
|
HANDLE hDDESent; // in case NACK is returned.
|
|
HANDLE hDDEResult;
|
|
} XACT_INFO;
|
|
|
|
#define XIF_SYNCHRONOUS 0x1
|
|
#define XIF_COMPLETE 0x2
|
|
#define XIF_ABANDONED 0x4
|
|
|
|
#define TID_TIMEOUT 1
|
|
|
|
// Advise link tracking stuff -----------------------------------
|
|
|
|
typedef struct tagLINK_COUNT *PLINK_COUNT;
|
|
typedef struct tagADVISE_LINK {
|
|
struct tagLINK_COUNT *pLinkCount;
|
|
LATOM laItem;
|
|
WORD wFmt;
|
|
WORD wType; // XTYP_ and XTYPF_ constants
|
|
WORD state; // ADVST_ constant
|
|
} ADVISE_LINK, *PADVISE_LINK;
|
|
|
|
#define ADVST_WAITING 0x0080
|
|
#define ADVST_CHANGED 0x0040
|
|
|
|
// DDE message handling stuff -----------------------------------
|
|
|
|
typedef struct tagDDE_MESSAGE_QUEUE {
|
|
struct tagDDE_MESSAGE_QUEUE *next;
|
|
struct tagCONV_INFO *pcoi;
|
|
UINT msg;
|
|
LPARAM lParam;
|
|
} DDE_MESSAGE_QUEUE, *PDDE_MESSAGE_QUEUE;
|
|
|
|
// instance info stuff -------------------------------------------
|
|
|
|
typedef struct tagSERVER_LOOKUP {
|
|
LATOM laService;
|
|
LATOM laTopic;
|
|
HWND hwndServer;
|
|
} SERVER_LOOKUP, *PSERVER_LOOKUP;
|
|
|
|
typedef struct tagLINK_COUNT {
|
|
struct tagLINK_COUNT *next;
|
|
LATOM laTopic;
|
|
GATOM gaItem;
|
|
LATOM laItem;
|
|
WORD wFmt;
|
|
short Total;
|
|
short Count;
|
|
} LINK_COUNT;
|
|
|
|
typedef struct tagCL_INSTANCE_INFO {
|
|
struct tagCL_INSTANCE_INFO *next;
|
|
HANDLE hInstServer;
|
|
HANDLE hInstClient;
|
|
DWORD MonitorFlags;
|
|
HWND hwndMother;
|
|
HWND hwndEvent;
|
|
HWND hwndTimeout;
|
|
DWORD afCmd;
|
|
PFNCALLBACK pfnCallback;
|
|
DWORD LastError;
|
|
DWORD tid;
|
|
LATOM *plaNameService;
|
|
WORD cNameServiceAlloc;
|
|
PSERVER_LOOKUP aServerLookup;
|
|
short cServerLookupAlloc;
|
|
WORD ConvStartupState;
|
|
WORD flags; // IIF_ flags
|
|
short cInDDEMLCallback;
|
|
PLINK_COUNT pLinkCount;
|
|
} CL_INSTANCE_INFO, *PCL_INSTANCE_INFO;
|
|
|
|
#define IIF_IN_SYNC_XACT 0x0001
|
|
#define IIF_UNICODE 0x8000
|
|
|
|
// conversation stuff ---------------------------------------------
|
|
|
|
typedef struct tagCONV_INFO {
|
|
struct tagCONV_INFO *next;
|
|
PCL_INSTANCE_INFO pcii;
|
|
DWORD_PTR hUser;
|
|
HCONV hConv;
|
|
LATOM laService;
|
|
LATOM laTopic;
|
|
HWND hwndPartner;
|
|
HWND hwndConv;
|
|
WORD state; // ST_ flags
|
|
LATOM laServiceRequested;
|
|
PXACT_INFO pxiIn;
|
|
PXACT_INFO pxiOut;
|
|
PDDE_MESSAGE_QUEUE dmqIn;
|
|
PDDE_MESSAGE_QUEUE dmqOut;
|
|
PADVISE_LINK aLinks;
|
|
int cLinks;
|
|
int cLocks;
|
|
} CONV_INFO, *PCONV_INFO;
|
|
|
|
typedef struct tagCL_CONV_INFO {
|
|
CONV_INFO ci;
|
|
HWND hwndReconnect;
|
|
HCONVLIST hConvList;
|
|
} CL_CONV_INFO, *PCL_CONV_INFO;
|
|
|
|
typedef struct tagSVR_CONV_INFO {
|
|
CONV_INFO ci;
|
|
} SVR_CONV_INFO, *PSVR_CONV_INFO;
|
|
|
|
typedef struct tagCONVLIST {
|
|
int chwnd; // number of client windows in this list
|
|
HWND ahwnd[1]; // windows in list.
|
|
} CONVLIST, *PCONVLIST;
|
|
|
|
extern CONVCONTEXT DefConvContext; // global from connect.c
|
|
|
|
typedef struct tagENABLE_ENUM_STRUCT{
|
|
BOOL *pfRet;
|
|
WORD wCmd;
|
|
WORD wCmd2;
|
|
} ENABLE_ENUM_STRUCT, *PENABLE_ENUM_STRUCT;
|
|
|
|
// memory management stuff -------------------------------------
|
|
|
|
typedef struct tagDDEMLDATA {
|
|
HANDLE hDDE; // Global data handle or data token
|
|
DWORD flags; // See HDATA_ constants
|
|
} DDEMLDATA, *PDDEMLDATA;
|
|
|
|
// DDEML client side Globals -----------------------------------
|
|
|
|
extern PHANDLE aInstance;
|
|
extern DWORD gWM_REGISTERCALLBACK;
|
|
|
|
// prototypes --------------------------------------------------
|
|
|
|
// handles.c
|
|
|
|
HANDLE CreateHandle(ULONG_PTR dwData, DWORD type, DWORD inst);
|
|
ULONG_PTR DestroyHandle(HANDLE h);
|
|
ULONG_PTR GetHandleData(HANDLE h);
|
|
VOID SetHandleData(HANDLE h, ULONG_PTR dwData);
|
|
ULONG_PTR ValidateCHandle(HANDLE h, DWORD ExpectedType, DWORD ExpectedInstance);
|
|
PCL_INSTANCE_INFO PciiFromHandle(HANDLE h);
|
|
HANDLE FindIstanceHandleFromHandle(HANDLE h);
|
|
VOID ApplyFunctionToObjects(DWORD ExpectedType, DWORD ExpectedInstance,
|
|
PFNHANDLEAPPLY pfn);
|
|
VOID BestSetLastDDEMLError(DWORD error);
|
|
|
|
// ddemlcli.c
|
|
|
|
UINT InternalDdeInitialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd,
|
|
BOOL fUnicode);
|
|
// DDEML API DdeInitializeA
|
|
// DDEML API DdeInitializeW
|
|
// DDEML API DdeUninitialize
|
|
// DDEML API DdeNameService
|
|
// DDEML API DdeGetLastError
|
|
|
|
// instance.c
|
|
|
|
HANDLE AddInstance(HANDLE hInst);
|
|
HANDLE DestroyInstance(HANDLE hInst);
|
|
PCL_INSTANCE_INFO ValidateInstance(HANDLE hInst);
|
|
BOOL CsClearSecurityForAck(HANDLE hInst, HWND hwndServer, HWND hwndClient);
|
|
VOID SetLastDDEMLError(PCL_INSTANCE_INFO pcii, DWORD error);
|
|
|
|
// hsz.c
|
|
|
|
HSZ InternalDdeCreateStringHandle(DWORD idInst, PVOID psz, int iCodePage);
|
|
// DDEML API DdeCreateStringHandleA
|
|
// DDEML API DdeCreateStringHandleW
|
|
DWORD InternalDdeQueryString(DWORD idInst, HSZ hsz, PVOID psz, DWORD cchMax,
|
|
INT iCodePage);
|
|
// DDEML API DdeQueryStringA
|
|
// DDEML API DdeQueryStringW
|
|
// DDEML API DdeFreeStringHandle
|
|
// DDEML API DdeKeepStringHandle
|
|
// DDEML API DdeCmpStringHandles
|
|
|
|
DWORD ValidateHSZ(HSZ hsz);
|
|
LATOM MakeInstSpecificAtom(LATOM la, HWND hwnd);
|
|
HWND ParseInstSpecificAtom(LATOM la, LATOM *plaNormal);
|
|
GATOM LocalToGlobalAtom(LATOM la);
|
|
LATOM GlobalToLocalAtom(GATOM ga);
|
|
GATOM IncGlobalAtomCount(GATOM la);
|
|
LATOM IncLocalAtomCount(LATOM la);
|
|
|
|
// connect.c
|
|
|
|
// DDEML API DdeConnect
|
|
// DDEML API DdeConnectList
|
|
// DDEML API DdeReconnect
|
|
BOOL ValidateConnectParameters(HANDLE hInst, PCL_INSTANCE_INFO *ppcii,
|
|
HSZ *phszService, HSZ hszTopic, LATOM *plaNormalSvcName,
|
|
PCONVCONTEXT *ppCC, HWND *phwndTarget, HCONVLIST hConvList);
|
|
PCL_CONV_INFO ConnectConv(PCL_INSTANCE_INFO pcii, LATOM laService,
|
|
LATOM laTopic, HWND hwndTarget, HWND hwndSkip,
|
|
PCONVCONTEXT pCC, HCONVLIST hConvList, DWORD clst);
|
|
VOID SetCommonStateFlags(HWND hwndUs, HWND hwndThem, PWORD pwFlags);
|
|
// DDEML API DdeQueryNextServer
|
|
// DDEML API DdeDisconnect
|
|
// DDEML API DdeDisconnectList
|
|
VOID ShutdownConversation(PCONV_INFO pcoi, BOOL fMakeCallback);
|
|
VOID FreeConversationResources(PCONV_INFO pcoi);
|
|
BOOL WaitForZombieTerminate(HANDLE hData);
|
|
|
|
// xact.c
|
|
|
|
VOID GetConvContext(HWND hwnd, LONG *pl);
|
|
VOID SetConvContext(HWND hwnd, LONG *pl);
|
|
// DDEML API DdeClientTransaction
|
|
// DDEML API DdeQueryConvInfo
|
|
// DDEML API DdeSetUserHandle
|
|
// DDEML API DdeAbandonTransaction
|
|
BOOL
|
|
UpdateLinkIfChanged(
|
|
PADVISE_LINK paLink,
|
|
PXACT_INFO pxi,
|
|
PCONV_INFO pcoi,
|
|
PADVISE_LINK paLinkLast,
|
|
PBOOL pfSwapped,
|
|
DWORD cLinksToGo);
|
|
|
|
// DDEML API DdePostAdvise
|
|
VOID LinkTransaction(PXACT_INFO pxi);
|
|
VOID UnlinkTransaction(PXACT_INFO pxi);
|
|
BOOL ValidateTransaction(HCONV hConv, HANDLE hXact, PCONV_INFO *ppcoi,
|
|
PXACT_INFO *ppxi);
|
|
|
|
|
|
// hdata.c
|
|
|
|
// DDEML API DdeCreateDataHandle
|
|
HDDEDATA InternalCreateDataHandle(PCL_INSTANCE_INFO pcii, LPBYTE pSrc, DWORD cb,
|
|
DWORD cbOff, DWORD flags, WORD wStatus, WORD wFmt);
|
|
// DDEML API DdeAddData
|
|
// DDEML API DdeGetData
|
|
// DDEML API DdeAccessData
|
|
// DDEML API DdeUnaccessData
|
|
// DDEML API DdeFreeDataHandle
|
|
BOOL ApplyFreeDataHandle(HANDLE hData);
|
|
BOOL InternalFreeDataHandle(HDDEDATA hData, BOOL fIgnorefRelease);
|
|
VOID FreeDDEData(HANDLE hDDE, BOOL fIgnorefRelease, BOOL fFreeTruelyGlobalObjects);
|
|
HANDLE CopyDDEData(HANDLE hDDE, BOOL fExec);
|
|
|
|
// callback.c
|
|
|
|
HDDEDATA DoCallback(PCL_INSTANCE_INFO pcii, WORD wType, WORD wFmt, HCONV hConv,
|
|
HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dw1, ULONG_PTR dw2);
|
|
DWORD _ClientEventCallback(PCL_INSTANCE_INFO pcii, PEVENT_PACKET pep);
|
|
// DDEML API DdeEnableCallback
|
|
BOOL SetEnableState(PCONV_INFO pcoi, UINT wCmd);
|
|
DWORD _ClientGetDDEHookData(UINT message, LPARAM lParam,
|
|
PDDEML_MSG_HOOK_DATA pdmhd);
|
|
DWORD _ClientGetDDEFlags(HANDLE hClient, DWORD flags);
|
|
BOOL EnableEnumProc(HWND hwnd, PENABLE_ENUM_STRUCT pees);
|
|
|
|
// ddemlwp.c
|
|
|
|
LRESULT DDEMLMotherWndProc(HWND, UINT, WPARAM, LPARAM);
|
|
LRESULT DDEMLClientWndProc(HWND, UINT, WPARAM, LPARAM);
|
|
LRESULT DDEMLServerWndProc(HWND, UINT, WPARAM, LPARAM);
|
|
PCONV_INFO ProcessTerminateMsg(PCONV_INFO pcoi, HWND hwndFrom);
|
|
VOID ProcessAsyncDDEMsg(PCONV_INFO pcoi, UINT msg, HWND hwndFrom, LPARAM lParam);
|
|
BOOL CheckForQueuedMessages(PCONV_INFO pcoi);
|
|
VOID DumpDDEMessage(BOOL fFreeData, UINT msg, LPARAM lParam);
|
|
BOOL ProcessSyncDDEMessage(PCONV_INFO pcoi, UINT msg, LPARAM lParam);
|
|
|
|
// stdptcl.c
|
|
|
|
BOOL ClStartAdvise(PXACT_INFO pxi);
|
|
BOOL SvSpontAdvise(PSVR_CONV_INFO psi, LPARAM lParam);
|
|
BOOL ClRespAdviseAck(PXACT_INFO pxi, UINT msg, LPARAM lParam);
|
|
BOOL SvStartAdviseUpdate(PXACT_INFO pxi, DWORD cLinksToGo);
|
|
BOOL ClSpontAdviseData(PCL_CONV_INFO pci, LPARAM lParam);
|
|
BOOL SvRespAdviseDataAck(PXACT_INFO pxi, UINT msg, LPARAM lParam);
|
|
BOOL ClStartUnadvise(PXACT_INFO pxi);
|
|
BOOL SvSpontUnadvise(PSVR_CONV_INFO psi, LPARAM lParam);
|
|
BOOL ClRespUnadviseAck(PXACT_INFO pxi, UINT msg, LPARAM lParam);
|
|
BOOL ClStartExecute(PXACT_INFO pxi);
|
|
BOOL ClRespExecuteAck(PXACT_INFO pxi, UINT msg, LPARAM lParam);
|
|
BOOL ClStartPoke(PXACT_INFO pxi);
|
|
BOOL SvSpontPoke(PSVR_CONV_INFO psi, LPARAM lParam);
|
|
BOOL ClRespPokeAck(PXACT_INFO pxi, UINT msg, LPARAM lParam);
|
|
BOOL ClStartRequest(PXACT_INFO pxi);
|
|
BOOL SvSpontRequest(PSVR_CONV_INFO psi, LPARAM lParam);
|
|
BOOL ClRespRequestData(PXACT_INFO pxi, UINT msg, LPARAM lParam);
|
|
BOOL SpontaneousClientMessage(PCL_CONV_INFO pci, UINT msg, LPARAM lParam);
|
|
BOOL SpontaneousServerMessage(PSVR_CONV_INFO psi, UINT msg, LPARAM lParam);
|
|
HANDLE AllocAndSetDDEData(LPBYTE pSrc, DWORD cb, WORD wStatus, WORD wFmt);
|
|
DWORD PackAndPostMessage(HWND hwndTo, UINT msgIn, UINT msgOut, HWND hwndFrom,
|
|
LPARAM lParam, UINT_PTR uiLo, UINT_PTR uiHi);
|
|
BOOL ExtractDDEDataInfo(HANDLE hDDE, LPWORD pwStatus, LPWORD pwFmt);
|
|
BOOL TransactionComplete(PXACT_INFO pxi, HDDEDATA hData);
|
|
HANDLE UnpackAndFreeDDEMLDataHandle(HDDEDATA hData, BOOL fExec);
|
|
|
|
// util.c
|
|
|
|
BOOL AddLink(PCONV_INFO pcoi, GATOM gaItem, WORD wFmt, WORD wType);
|
|
VOID DeleteLinkCount(PCL_INSTANCE_INFO pcii, PLINK_COUNT pLinkCountDelete);
|
|
|
|
// monitor.c
|
|
|
|
VOID MonitorStringHandle(PCL_INSTANCE_INFO pcii, HSZ hsz, DWORD fsAction);
|
|
VOID MonitorLink(PCL_INSTANCE_INFO pcii, BOOL fEstablished, BOOL fNoData,
|
|
LATOM laSvc, LATOM laTopic, GATOM gaItem, WORD wFmt, BOOL fServer,
|
|
HCONV hConvServer, HCONV hConvClient);
|
|
VOID MonitorConv(PCONV_INFO pcoi, BOOL fConnect);
|
|
|
|
// register.c
|
|
|
|
VOID RegisterService(BOOL fRegister, GATOM gaApp, HWND hwndListen);
|
|
LRESULT ProcessRegistrationMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|