Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

ddemlcli.h

Go to the documentation of this file.
00001 /****************************** Module Header ******************************\ 00002 * Module Name: ddemlcli.h 00003 * 00004 * Copyright (c) 1985 - 1999, Microsoft Corporation 00005 * 00006 * This header file contains stuff used by client side ddeml code. 00007 * 00008 * History: 00009 * 10-28-91 Sanfords Created 00010 \***************************************************************************/ 00011 #if DBG 00012 #define DDEMLAlloc(cb) RtlAllocateHeap(gpDDEMLHeap, HEAP_ZERO_MEMORY, (cb)) 00013 #define DDEMLReAlloc(p, cb) RtlReAllocateHeap(gpDDEMLHeap, HEAP_ZERO_MEMORY, (p), (cb)) 00014 #define DDEMLFree(p) RtlFreeHeap(gpDDEMLHeap, 0, (p)) 00015 #else 00016 #define DDEMLAlloc(cb) LocalAlloc(LPTR, cb) 00017 #define DDEMLReAlloc(p, cb) LocalReAlloc(p, cb, LHND) 00018 #define DDEMLFree(p) LocalFree(p); 00019 #endif 00020 00021 00022 // general typedefs 00023 00024 typedef ATOM LATOM; 00025 typedef ATOM GATOM; 00026 00027 // monitor stuff ------------------------------------------ 00028 00029 #define MONHSZ(pcii, hsz, type) if ((pcii->MonitorFlags & MF_HSZ_INFO) && hsz) \ 00030 MonitorStringHandle(pcii, hsz, type) 00031 #define MONLINK(pcii, fEst, fNoD, aS, aT, aI, wFmt, fSvr, hConvS, hConvC) \ 00032 if (pcii->MonitorFlags & MF_LINKS) \ 00033 MonitorLink(pcii, fEst, fNoD, aS, aT, aI, \ 00034 wFmt, fSvr, hConvS, hConvC) 00035 00036 #define MONCONV(pcoi, fConn) \ 00037 if (((pcoi)->pcii->MonitorFlags & MF_CONV) && \ 00038 ((((pcoi)->state & ST_ISLOCAL) && (pcoi)->state & ST_CLIENT) || \ 00039 !((pcoi)->state & ST_ISLOCAL))) \ 00040 MonitorConv(pcoi, fConn); 00041 00042 // critical section stuff --------------------------------- 00043 00044 extern RTL_CRITICAL_SECTION gcsDDEML; 00045 #if DBG 00046 extern PVOID gpDDEMLHeap; 00047 #endif 00048 #define EnterDDECrit RtlEnterCriticalSection(&gcsDDEML); 00049 #define LeaveDDECrit RtlLeaveCriticalSection(&gcsDDEML); 00050 #if DBG 00051 #define CheckDDECritIn if (GetCurrentThreadId() != HandleToUlong(gcsDDEML.OwningThread)) { \ 00052 RIPMSG0(RIP_ERROR, "CheckDDECritIn failed"); \ 00053 } 00054 #define CheckDDECritOut if (GetCurrentThreadId() == HandleToUlong(gcsDDEML.OwningThread)) { \ 00055 RIPMSG0(RIP_ERROR, "CheckDDECritoUT failed"); \ 00056 } 00057 #else 00058 #define CheckDDECritIn ; 00059 #define CheckDDECritOut ; 00060 #endif 00061 00062 // String handle stuff ------------------------------------- 00063 00064 // return values for ValidateHSZ macro 00065 #define HSZT_INVALID 0 00066 #define HSZT_NORMAL 1 00067 #define HSZT_INST_SPECIFIC 2 00068 00069 #define LATOM_FROM_HSZ(hsz) (LATOM)(ULONG_PTR)(hsz) 00070 #define NORMAL_HSZ_FROM_LATOM(a) (HSZ)(ULONG_PTR)(a) 00071 #define INST_SPECIFIC_HSZ_FROM_LATOM(a) (HSZ)LongToHandle( MAKELONG(a, 1) ) 00072 00073 // Handle manager stuff ------------------------------------------ 00074 00075 typedef struct tagCHANDLEENTRY { 00076 HANDLE handle; 00077 ULONG_PTR dwData; 00078 } CHANDLEENTRY, *PCHANDLEENTRY; 00079 00080 typedef BOOL (*PFNHANDLEAPPLY)(HANDLE); 00081 00082 #define MASK_ID 0xFF000000 // 256 uniqueness 00083 #define SHIFT_ID 24 00084 #define MASK_INDEX 0x00FFFC00 // 16K handles per process max 00085 #define SHIFT_INDEX 10 00086 #define MASK_TYPE 0x00000380 // 8 types max 00087 #define SHIFT_TYPE 7 00088 #define MASK_INST 0x0000007F // 128 instances per process max 00089 #define SHIFT_INST 0 00090 #define MAX_INST MASK_INST 00091 00092 #define IdFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_ID) >> SHIFT_ID) 00093 #define IndexFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_INDEX) >> SHIFT_INDEX) 00094 #define TypeFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_TYPE) >> SHIFT_TYPE) 00095 #define InstFromHandle(h) (DWORD)(((ULONG_PTR)(h) & MASK_INST) >> SHIFT_INST) 00096 00097 #define HandleFromId(h) (((DWORD)(h)) << SHIFT_ID) 00098 #define HandleFromIndex(h) (((DWORD)(h)) << SHIFT_INDEX) 00099 #define HandleFromType(h) (((DWORD)(h)) << SHIFT_TYPE) 00100 #define HandleFromInst(h) (((DWORD)(h)) << SHIFT_INST) 00101 00102 #define HTYPE_EMPTY 0 00103 #define HTYPE_INSTANCE 1 00104 #define HTYPE_SERVER_CONVERSATION 2 00105 #define HTYPE_CLIENT_CONVERSATION 3 00106 #define HTYPE_CONVERSATION_LIST 4 00107 #define HTYPE_TRANSACTION 5 00108 #define HTYPE_DATA_HANDLE 6 00109 #define HTYPE_ZOMBIE_CONVERSATION 7 00110 00111 #define HTYPE_ANY (DWORD)(-1) 00112 #define HINST_ANY (DWORD)(-1) 00113 00114 // transaction stuff ------------------------------------------- 00115 00116 typedef struct tagXACT_INFO *PXACT_INFO; 00117 00118 typedef BOOL (* FNRESPONSE)(PXACT_INFO, UINT, LPARAM); 00119 00120 typedef struct tagXACT_INFO { 00121 struct tagXACT_INFO *next; 00122 struct tagCONV_INFO *pcoi; 00123 DWORD_PTR hUser; 00124 HANDLE hXact; 00125 FNRESPONSE pfnResponse; 00126 GATOM gaItem; 00127 WORD wFmt; 00128 WORD wType; // for DdeQueryConvInfo only 00129 WORD wStatus; // see DDE_F flags 00130 WORD flags; // see XIF_ flags 00131 WORD state; // see XST_ state values (ddeml.h) 00132 HANDLE hDDESent; // in case NACK is returned. 00133 HANDLE hDDEResult; 00134 } XACT_INFO; 00135 00136 #define XIF_SYNCHRONOUS 0x1 00137 #define XIF_COMPLETE 0x2 00138 #define XIF_ABANDONED 0x4 00139 00140 #define TID_TIMEOUT 1 00141 00142 // Advise link tracking stuff ----------------------------------- 00143 00144 typedef struct tagLINK_COUNT *PLINK_COUNT; 00145 typedef struct tagADVISE_LINK { 00146 struct tagLINK_COUNT *pLinkCount; 00147 LATOM laItem; 00148 WORD wFmt; 00149 WORD wType; // XTYP_ and XTYPF_ constants 00150 WORD state; // ADVST_ constant 00151 } ADVISE_LINK, *PADVISE_LINK; 00152 00153 #define ADVST_WAITING 0x0080 00154 #define ADVST_CHANGED 0x0040 00155 00156 // DDE message handling stuff ----------------------------------- 00157 00158 typedef struct tagDDE_MESSAGE_QUEUE { 00159 struct tagDDE_MESSAGE_QUEUE *next; 00160 struct tagCONV_INFO *pcoi; 00161 UINT msg; 00162 LPARAM lParam; 00163 } DDE_MESSAGE_QUEUE, *PDDE_MESSAGE_QUEUE; 00164 00165 // instance info stuff ------------------------------------------- 00166 00167 typedef struct tagSERVER_LOOKUP { 00168 LATOM laService; 00169 LATOM laTopic; 00170 HWND hwndServer; 00171 } SERVER_LOOKUP, *PSERVER_LOOKUP; 00172 00173 typedef struct tagLINK_COUNT { 00174 struct tagLINK_COUNT *next; 00175 LATOM laTopic; 00176 GATOM gaItem; 00177 LATOM laItem; 00178 WORD wFmt; 00179 short Total; 00180 short Count; 00181 } LINK_COUNT; 00182 00183 typedef struct tagCL_INSTANCE_INFO { 00184 struct tagCL_INSTANCE_INFO *next; 00185 HANDLE hInstServer; 00186 HANDLE hInstClient; 00187 DWORD MonitorFlags; 00188 HWND hwndMother; 00189 HWND hwndEvent; 00190 HWND hwndTimeout; 00191 DWORD afCmd; 00192 PFNCALLBACK pfnCallback; 00193 DWORD LastError; 00194 DWORD tid; 00195 LATOM *plaNameService; 00196 WORD cNameServiceAlloc; 00197 PSERVER_LOOKUP aServerLookup; 00198 short cServerLookupAlloc; 00199 WORD ConvStartupState; 00200 WORD flags; // IIF_ flags 00201 short cInDDEMLCallback; 00202 PLINK_COUNT pLinkCount; 00203 } CL_INSTANCE_INFO, *PCL_INSTANCE_INFO; 00204 00205 #define IIF_IN_SYNC_XACT 0x0001 00206 #define IIF_UNICODE 0x8000 00207 00208 // conversation stuff --------------------------------------------- 00209 00210 typedef struct tagCONV_INFO { 00211 struct tagCONV_INFO *next; 00212 PCL_INSTANCE_INFO pcii; 00213 DWORD_PTR hUser; 00214 HCONV hConv; 00215 LATOM laService; 00216 LATOM laTopic; 00217 HWND hwndPartner; 00218 HWND hwndConv; 00219 WORD state; // ST_ flags 00220 LATOM laServiceRequested; 00221 PXACT_INFO pxiIn; 00222 PXACT_INFO pxiOut; 00223 PDDE_MESSAGE_QUEUE dmqIn; 00224 PDDE_MESSAGE_QUEUE dmqOut; 00225 PADVISE_LINK aLinks; 00226 int cLinks; 00227 int cLocks; 00228 } CONV_INFO, *PCONV_INFO; 00229 00230 typedef struct tagCL_CONV_INFO { 00231 CONV_INFO ci; 00232 HWND hwndReconnect; 00233 HCONVLIST hConvList; 00234 } CL_CONV_INFO, *PCL_CONV_INFO; 00235 00236 typedef struct tagSVR_CONV_INFO { 00237 CONV_INFO ci; 00238 } SVR_CONV_INFO, *PSVR_CONV_INFO; 00239 00240 typedef struct tagCONVLIST { 00241 int chwnd; // number of client windows in this list 00242 HWND ahwnd[1]; // windows in list. 00243 } CONVLIST, *PCONVLIST; 00244 00245 extern CONVCONTEXT DefConvContext; // global from connect.c 00246 00247 typedef struct tagENABLE_ENUM_STRUCT{ 00248 BOOL *pfRet; 00249 WORD wCmd; 00250 WORD wCmd2; 00251 } ENABLE_ENUM_STRUCT, *PENABLE_ENUM_STRUCT; 00252 00253 // memory management stuff ------------------------------------- 00254 00255 typedef struct tagDDEMLDATA { 00256 HANDLE hDDE; // Global data handle or data token 00257 DWORD flags; // See HDATA_ constants 00258 } DDEMLDATA, *PDDEMLDATA; 00259 00260 // DDEML client side Globals ----------------------------------- 00261 00262 extern PHANDLE aInstance; 00263 extern DWORD gWM_REGISTERCALLBACK; 00264 00265 // prototypes -------------------------------------------------- 00266 00267 // handles.c 00268 00269 HANDLE CreateHandle(ULONG_PTR dwData, DWORD type, DWORD inst); 00270 ULONG_PTR DestroyHandle(HANDLE h); 00271 ULONG_PTR GetHandleData(HANDLE h); 00272 VOID SetHandleData(HANDLE h, ULONG_PTR dwData); 00273 ULONG_PTR ValidateCHandle(HANDLE h, DWORD ExpectedType, DWORD ExpectedInstance); 00274 PCL_INSTANCE_INFO PciiFromHandle(HANDLE h); 00275 HANDLE FindIstanceHandleFromHandle(HANDLE h); 00276 VOID ApplyFunctionToObjects(DWORD ExpectedType, DWORD ExpectedInstance, 00277 PFNHANDLEAPPLY pfn); 00278 VOID BestSetLastDDEMLError(DWORD error); 00279 00280 // clinit.c 00281 00282 BOOL RW_RegisterDDEML(void); 00283 00284 // ddemlcli.c 00285 00286 UINT InternalDdeInitialize(LPDWORD pidInst, PFNCALLBACK pfnCallback, DWORD afCmd, 00287 BOOL fUnicode); 00288 // DDEML API DdeInitializeA 00289 // DDEML API DdeInitializeW 00290 // DDEML API DdeUninitialize 00291 // DDEML API DdeNameService 00292 // DDEML API DdeGetLastError 00293 00294 // instance.c 00295 00296 HANDLE AddInstance(HANDLE hInst); 00297 HANDLE DestroyInstance(HANDLE hInst); 00298 PCL_INSTANCE_INFO ValidateInstance(HANDLE hInst); 00299 BOOL CsClearSecurityForAck(HANDLE hInst, HWND hwndServer, HWND hwndClient); 00300 VOID SetLastDDEMLError(PCL_INSTANCE_INFO pcii, DWORD error); 00301 00302 // hsz.c 00303 00304 HSZ InternalDdeCreateStringHandle(DWORD idInst, PVOID psz, int iCodePage); 00305 // DDEML API DdeCreateStringHandleA 00306 // DDEML API DdeCreateStringHandleW 00307 DWORD InternalDdeQueryString(DWORD idInst, HSZ hsz, PVOID psz, DWORD cchMax, 00308 INT iCodePage); 00309 // DDEML API DdeQueryStringA 00310 // DDEML API DdeQueryStringW 00311 // DDEML API DdeFreeStringHandle 00312 // DDEML API DdeKeepStringHandle 00313 // DDEML API DdeCmpStringHandles 00314 00315 DWORD ValidateHSZ(HSZ hsz); 00316 LATOM MakeInstSpecificAtom(LATOM la, HWND hwnd); 00317 HWND ParseInstSpecificAtom(LATOM la, LATOM *plaNormal); 00318 GATOM LocalToGlobalAtom(LATOM la); 00319 LATOM GlobalToLocalAtom(GATOM ga); 00320 GATOM IncGlobalAtomCount(GATOM la); 00321 LATOM IncLocalAtomCount(LATOM la); 00322 00323 // connect.c 00324 00325 // DDEML API DdeConnect 00326 // DDEML API DdeConnectList 00327 // DDEML API DdeReconnect 00328 BOOL ValidateConnectParameters(HANDLE hInst, PCL_INSTANCE_INFO *ppcii, 00329 HSZ *phszService, HSZ hszTopic, LATOM *plaNormalSvcName, 00330 PCONVCONTEXT *ppCC, HWND *phwndTarget, HCONVLIST hConvList); 00331 PCL_CONV_INFO ConnectConv(PCL_INSTANCE_INFO pcii, LATOM laService, 00332 LATOM laTopic, HWND hwndTarget, HWND hwndSkip, 00333 PCONVCONTEXT pCC, HCONVLIST hConvList, DWORD clst); 00334 VOID SetCommonStateFlags(HWND hwndUs, HWND hwndThem, PWORD pwFlags); 00335 // DDEML API DdeQueryNextServer 00336 // DDEML API DdeDisconnect 00337 // DDEML API DdeDisconnectList 00338 VOID ShutdownConversation(PCONV_INFO pcoi, BOOL fMakeCallback); 00339 VOID FreeConversationResources(PCONV_INFO pcoi); 00340 BOOL WaitForZombieTerminate(HANDLE hData); 00341 00342 // xact.c 00343 00344 VOID GetConvContext(HWND hwnd, LONG *pl); 00345 VOID SetConvContext(HWND hwnd, LONG *pl); 00346 // DDEML API DdeClientTransaction 00347 // DDEML API DdeQueryConvInfo 00348 // DDEML API DdeSetUserHandle 00349 // DDEML API DdeAbandonTransaction 00350 BOOL 00351 UpdateLinkIfChanged( 00352 PADVISE_LINK paLink, 00353 PXACT_INFO pxi, 00354 PCONV_INFO pcoi, 00355 PADVISE_LINK paLinkLast, 00356 PBOOL pfSwapped, 00357 DWORD cLinksToGo); 00358 00359 // DDEML API DdePostAdvise 00360 VOID LinkTransaction(PXACT_INFO pxi); 00361 VOID UnlinkTransaction(PXACT_INFO pxi); 00362 BOOL ValidateTransaction(HCONV hConv, HANDLE hXact, PCONV_INFO *ppcoi, 00363 PXACT_INFO *ppxi); 00364 00365 00366 // hdata.c 00367 00368 // DDEML API DdeCreateDataHandle 00369 HDDEDATA InternalCreateDataHandle(PCL_INSTANCE_INFO pcii, LPBYTE pSrc, DWORD cb, 00370 DWORD cbOff, DWORD flags, WORD wStatus, WORD wFmt); 00371 // DDEML API DdeAddData 00372 // DDEML API DdeGetData 00373 // DDEML API DdeAccessData 00374 // DDEML API DdeUnaccessData 00375 // DDEML API DdeFreeDataHandle 00376 BOOL ApplyFreeDataHandle(HANDLE hData); 00377 BOOL InternalFreeDataHandle(HDDEDATA hData, BOOL fIgnorefRelease); 00378 VOID FreeDDEData(HANDLE hDDE, BOOL fIgnorefRelease, BOOL fFreeTruelyGlobalObjects); 00379 HANDLE CopyDDEData(HANDLE hDDE, BOOL fExec); 00380 00381 // callback.c 00382 00383 HDDEDATA DoCallback(PCL_INSTANCE_INFO pcii, WORD wType, WORD wFmt, HCONV hConv, 00384 HSZ hsz1, HSZ hsz2, HDDEDATA hData, ULONG_PTR dw1, ULONG_PTR dw2); 00385 DWORD _ClientEventCallback(PCL_INSTANCE_INFO pcii, PEVENT_PACKET pep); 00386 // DDEML API DdeEnableCallback 00387 BOOL SetEnableState(PCONV_INFO pcoi, UINT wCmd); 00388 DWORD _ClientGetDDEHookData(UINT message, LPARAM lParam, 00389 PDDEML_MSG_HOOK_DATA pdmhd); 00390 DWORD _ClientGetDDEFlags(HANDLE hClient, DWORD flags); 00391 BOOL EnableEnumProc(HWND hwnd, PENABLE_ENUM_STRUCT pees); 00392 00393 // ddemlwp.c 00394 00395 LRESULT DDEMLMotherWndProc(HWND, UINT, WPARAM, LPARAM); 00396 LRESULT DDEMLClientWndProc(HWND, UINT, WPARAM, LPARAM); 00397 LRESULT DDEMLServerWndProc(HWND, UINT, WPARAM, LPARAM); 00398 PCONV_INFO ProcessTerminateMsg(PCONV_INFO pcoi, HWND hwndFrom); 00399 VOID ProcessAsyncDDEMsg(PCONV_INFO pcoi, UINT msg, HWND hwndFrom, LPARAM lParam); 00400 BOOL CheckForQueuedMessages(PCONV_INFO pcoi); 00401 VOID DumpDDEMessage(BOOL fFreeData, UINT msg, LPARAM lParam); 00402 BOOL ProcessSyncDDEMessage(PCONV_INFO pcoi, UINT msg, LPARAM lParam); 00403 00404 // stdptcl.c 00405 00406 BOOL ClStartAdvise(PXACT_INFO pxi); 00407 BOOL SvSpontAdvise(PSVR_CONV_INFO psi, LPARAM lParam); 00408 BOOL ClRespAdviseAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); 00409 BOOL SvStartAdviseUpdate(PXACT_INFO pxi, DWORD cLinksToGo); 00410 BOOL ClSpontAdviseData(PCL_CONV_INFO pci, LPARAM lParam); 00411 BOOL SvRespAdviseDataAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); 00412 BOOL ClStartUnadvise(PXACT_INFO pxi); 00413 BOOL SvSpontUnadvise(PSVR_CONV_INFO psi, LPARAM lParam); 00414 BOOL ClRespUnadviseAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); 00415 BOOL ClStartExecute(PXACT_INFO pxi); 00416 BOOL ClRespExecuteAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); 00417 BOOL ClStartPoke(PXACT_INFO pxi); 00418 BOOL SvSpontPoke(PSVR_CONV_INFO psi, LPARAM lParam); 00419 BOOL ClRespPokeAck(PXACT_INFO pxi, UINT msg, LPARAM lParam); 00420 BOOL ClStartRequest(PXACT_INFO pxi); 00421 BOOL SvSpontRequest(PSVR_CONV_INFO psi, LPARAM lParam); 00422 BOOL ClRespRequestData(PXACT_INFO pxi, UINT msg, LPARAM lParam); 00423 BOOL SpontaneousClientMessage(PCL_CONV_INFO pci, UINT msg, LPARAM lParam); 00424 BOOL SpontaneousServerMessage(PSVR_CONV_INFO psi, UINT msg, LPARAM lParam); 00425 HANDLE AllocAndSetDDEData(LPBYTE pSrc, DWORD cb, WORD wStatus, WORD wFmt); 00426 DWORD PackAndPostMessage(HWND hwndTo, UINT msgIn, UINT msgOut, HWND hwndFrom, 00427 LPARAM lParam, UINT_PTR uiLo, UINT_PTR uiHi); 00428 BOOL ExtractDDEDataInfo(HANDLE hDDE, LPWORD pwStatus, LPWORD pwFmt); 00429 BOOL TransactionComplete(PXACT_INFO pxi, HDDEDATA hData); 00430 HANDLE UnpackAndFreeDDEMLDataHandle(HDDEDATA hData, BOOL fExec); 00431 00432 // util.c 00433 00434 BOOL AddLink(PCONV_INFO pcoi, GATOM gaItem, WORD wFmt, WORD wType); 00435 VOID DeleteLinkCount(PCL_INSTANCE_INFO pcii, PLINK_COUNT pLinkCountDelete); 00436 00437 // monitor.c 00438 00439 VOID MonitorStringHandle(PCL_INSTANCE_INFO pcii, HSZ hsz, DWORD fsAction); 00440 VOID MonitorLink(PCL_INSTANCE_INFO pcii, BOOL fEstablished, BOOL fNoData, 00441 LATOM laSvc, LATOM laTopic, GATOM gaItem, WORD wFmt, BOOL fServer, 00442 HCONV hConvServer, HCONV hConvClient); 00443 VOID MonitorConv(PCONV_INFO pcoi, BOOL fConnect); 00444 00445 // register.c 00446 00447 VOID RegisterService(BOOL fRegister, GATOM gaApp, HWND hwndListen); 00448 LRESULT ProcessRegistrationMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

Generated on Sat May 15 19:39:39 2004 for test by doxygen 1.3.7