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

hsz.c

Go to the documentation of this file.
00001 /****************************** Module Header ******************************\ 00002 * Module Name: hsz.c 00003 * 00004 * Copyright (c) 1985 - 1999, Microsoft Corporation 00005 * 00006 * HSZ.C - DDEML String handle functions 00007 * 00008 * History: 00009 * 10-28-91 Sanfords Created 00010 \***************************************************************************/ 00011 00012 #include "precomp.h" 00013 #pragma hdrstop 00014 00015 /***************************************************************************\ 00016 * DdeCreateStringHandle (DDEML API) 00017 * 00018 * Description: 00019 * Create an HSZ from a string. 00020 * 00021 * History: 00022 * 11-1-91 sanfords Created. 00023 \***************************************************************************/ 00024 HSZ DdeCreateStringHandleA( 00025 DWORD idInst, 00026 LPCSTR psz, 00027 int iCodePage) 00028 { 00029 if (iCodePage == 0) { 00030 iCodePage = CP_WINANSI; 00031 } 00032 return (InternalDdeCreateStringHandle(idInst, (PVOID)psz, iCodePage)); 00033 } 00034 00035 00036 HSZ DdeCreateStringHandleW( 00037 DWORD idInst, 00038 LPCWSTR psz, 00039 int iCodePage) 00040 { 00041 if (iCodePage == 0) { 00042 iCodePage = CP_WINUNICODE; 00043 } 00044 return (InternalDdeCreateStringHandle(idInst, (PVOID)psz, iCodePage)); 00045 } 00046 00047 00048 00049 HSZ InternalDdeCreateStringHandle( 00050 DWORD idInst, 00051 PVOID psz, 00052 int iCodePage) 00053 { 00054 PCL_INSTANCE_INFO pcii; 00055 HSZ hszRet = 0; 00056 int cb; 00057 WCHAR szw[256]; 00058 00059 EnterDDECrit; 00060 00061 pcii = ValidateInstance((HANDLE)LongToHandle( idInst )); 00062 if (pcii == NULL) { 00063 BestSetLastDDEMLError(DMLERR_INVALIDPARAMETER); 00064 goto Exit; 00065 } 00066 00067 switch (iCodePage) { 00068 case CP_WINANSI: 00069 if (*(LPSTR)psz == '\0') { 00070 goto Exit; 00071 } 00072 hszRet = NORMAL_HSZ_FROM_LATOM(AddAtomA((LPSTR)psz)); 00073 break; 00074 00075 default: 00076 00077 /* 00078 * Convert psz to unicode and fall through. 00079 */ 00080 cb = sizeof(szw) / sizeof(WCHAR); 00081 #ifdef LATER 00082 MultiByteToWideChar((UINT)iCodePage, MB_PRECOMPOSED, 00083 (LPSTR)psz, -1, szw, cb); 00084 #endif 00085 psz = &szw[0]; 00086 00087 00088 case CP_WINUNICODE: 00089 if (*(LPWSTR)psz == L'\0') { 00090 goto Exit; 00091 } 00092 hszRet = NORMAL_HSZ_FROM_LATOM(AddAtomW((LPWSTR)psz)); 00093 break; 00094 } 00095 MONHSZ(pcii, hszRet, MH_CREATE); 00096 00097 Exit: 00098 LeaveDDECrit; 00099 return (hszRet); 00100 } 00101 00102 00103 00104 /***************************************************************************\ 00105 * DdeQueryString (DDEML API) 00106 * 00107 * Description: 00108 * Recall the string associated with an HSZ. 00109 * 00110 * History: 00111 * 11-1-91 sanfords Created. 00112 \***************************************************************************/ 00113 DWORD DdeQueryStringA( 00114 DWORD idInst, 00115 HSZ hsz, 00116 LPSTR psz, 00117 DWORD cchMax, 00118 INT iCodePage) 00119 { 00120 if (iCodePage == 0) { 00121 iCodePage = CP_WINANSI; 00122 } 00123 return (InternalDdeQueryString(idInst, hsz, psz, cchMax, iCodePage)); 00124 } 00125 00126 00127 DWORD DdeQueryStringW( 00128 DWORD idInst, 00129 HSZ hsz, 00130 LPWSTR psz, 00131 DWORD cchMax, 00132 INT iCodePage) 00133 { 00134 if (iCodePage == 0) { 00135 iCodePage = CP_WINUNICODE; 00136 } 00137 return (InternalDdeQueryString(idInst, hsz, psz, cchMax * sizeof(WCHAR), iCodePage)); 00138 } 00139 00140 00141 DWORD InternalDdeQueryString( 00142 DWORD idInst, 00143 HSZ hsz, 00144 PVOID psz, 00145 DWORD cbMax, 00146 INT iCodePage) 00147 { 00148 PCL_INSTANCE_INFO pcii; 00149 DWORD dwRet = 0; 00150 WCHAR szw[256]; 00151 // BOOL fDefUsed; // LATER 00152 00153 EnterDDECrit; 00154 00155 pcii = ValidateInstance((HANDLE)LongToHandle( idInst )); 00156 if (pcii == NULL) { 00157 BestSetLastDDEMLError(DMLERR_INVALIDPARAMETER); 00158 goto Exit; 00159 } 00160 00161 if (ValidateHSZ(hsz) == HSZT_INVALID) { 00162 SetLastDDEMLError(pcii, DMLERR_INVALIDPARAMETER); 00163 goto Exit; 00164 } 00165 00166 if (LATOM_FROM_HSZ(hsz) == 0) { 00167 if (iCodePage == CP_WINUNICODE) { 00168 if (psz != NULL) { 00169 *(LPWSTR)psz = L'\0'; 00170 } 00171 dwRet = sizeof(WCHAR); 00172 goto Exit; 00173 } else { 00174 if (psz != NULL) { 00175 *(LPSTR)psz = '\0'; 00176 } 00177 dwRet = sizeof(CHAR); 00178 goto Exit; 00179 } 00180 } 00181 00182 if (psz == NULL) { 00183 cbMax = sizeof(szw); 00184 psz = (PVOID)szw; 00185 } 00186 00187 switch (iCodePage) { 00188 case CP_WINANSI: 00189 dwRet = GetAtomNameA(LATOM_FROM_HSZ(hsz), psz, cbMax); 00190 break; 00191 00192 default: 00193 dwRet = GetAtomNameW(LATOM_FROM_HSZ(hsz), (LPWSTR)psz, cbMax / sizeof(WCHAR)); 00194 if (iCodePage != CP_WINUNICODE) { 00195 00196 /* 00197 * convert psz to the appropriate codepage and count the 00198 * characters(ie BYTES for DBCS!) to alter dwRet. 00199 */ 00200 #ifdef LATER 00201 // Does this routine work in place? (i.e. input and output buffer the same). 00202 WideCharToMultiByte((UINT)iCodePage, 0, szw, 00203 sizeof(szw) / sizeof(WCHAR), 00204 (LPSTR)psz, cbMax, NULL, &fDefUsed); 00205 #endif 00206 dwRet = cbMax + 1; 00207 } 00208 break; 00209 } 00210 00211 Exit: 00212 LeaveDDECrit; 00213 return (dwRet); 00214 } 00215 00216 00217 00218 /***************************************************************************\ 00219 * DdeFreeStringHandle (DDEML API) 00220 * 00221 * Description: 00222 * Decrement the use count of an HSZ. 00223 * 00224 * History: 00225 * 11-1-91 sanfords Created. 00226 \***************************************************************************/ 00227 BOOL DdeFreeStringHandle( 00228 DWORD idInst, 00229 HSZ hsz) 00230 { 00231 PCL_INSTANCE_INFO pcii; 00232 BOOL fRet = FALSE; 00233 00234 EnterDDECrit; 00235 00236 pcii = ValidateInstance((HANDLE)LongToHandle( idInst )); 00237 if (pcii == NULL) { 00238 BestSetLastDDEMLError(DMLERR_INVALIDPARAMETER); 00239 goto Exit; 00240 } 00241 00242 if (ValidateHSZ(hsz) == HSZT_INVALID) { 00243 SetLastDDEMLError(pcii, DMLERR_INVALIDPARAMETER); 00244 goto Exit; 00245 } 00246 00247 MONHSZ(pcii, hsz, MH_DELETE); 00248 fRet = TRUE; 00249 if (LATOM_FROM_HSZ(hsz) != 0) { 00250 if (DeleteAtom(LATOM_FROM_HSZ(hsz))) { 00251 SetLastDDEMLError(pcii, DMLERR_INVALIDPARAMETER); 00252 fRet = FALSE; 00253 } 00254 } 00255 00256 Exit: 00257 LeaveDDECrit; 00258 return (fRet); 00259 } 00260 00261 00262 00263 /***************************************************************************\ 00264 * DdeKeepStringHandle (DDEML API) 00265 * 00266 * Description: 00267 * Increments the use count of an HSZ. 00268 * 00269 * History: 00270 * 11-1-91 sanfords Created. 00271 \***************************************************************************/ 00272 BOOL DdeKeepStringHandle( 00273 DWORD idInst, 00274 HSZ hsz) 00275 { 00276 PCL_INSTANCE_INFO pcii; 00277 BOOL fRet = FALSE; 00278 00279 EnterDDECrit; 00280 00281 pcii = ValidateInstance((HANDLE)LongToHandle( idInst )); 00282 if (pcii == NULL) { 00283 BestSetLastDDEMLError(DMLERR_INVALIDPARAMETER); 00284 goto Exit; 00285 } 00286 00287 if (ValidateHSZ(hsz) == HSZT_INVALID) { 00288 SetLastDDEMLError(pcii, DMLERR_INVALIDPARAMETER); 00289 goto Exit; 00290 } 00291 00292 if (LATOM_FROM_HSZ(hsz) == 0) { 00293 fRet = TRUE; 00294 goto Exit; 00295 } 00296 MONHSZ(pcii, hsz, MH_KEEP); 00297 fRet = IncLocalAtomCount(LATOM_FROM_HSZ(hsz)) ? TRUE : FALSE; 00298 00299 Exit: 00300 LeaveDDECrit; 00301 return (fRet); 00302 } 00303 00304 00305 00306 /***************************************************************************\ 00307 * DdeCmpStringHandles (DDEML API) 00308 * 00309 * Description: 00310 * Useless comparison of hszs. Provided for case sensitivity expandability. 00311 * Direct comparison of hszs would be a case sensitive comparison while 00312 * using this function would be case-insensitive. For now both ways are ==. 00313 * 00314 * History: 00315 * 11-1-91 sanfords Created. 00316 \***************************************************************************/ 00317 int DdeCmpStringHandles( 00318 HSZ hsz1, 00319 HSZ hsz2) 00320 { 00321 if (hsz2 > hsz1) { 00322 return (-1); 00323 } else if (hsz2 < hsz1) { 00324 return (1); 00325 } else { 00326 return (0); 00327 } 00328 } 00329 00330 00331 /***************************************************************************\ 00332 * ValidateHSZ 00333 * 00334 * Description: 00335 * Verifies the probability of a reasonable hsz 00336 * 00337 * History: 00338 * 11-1-91 sanfords Created. 00339 \***************************************************************************/ 00340 DWORD ValidateHSZ( 00341 HSZ hsz) 00342 { 00343 if (hsz == 0) { 00344 return (HSZT_NORMAL); 00345 } 00346 if (LOWORD((ULONG_PTR)hsz) < 0xC000) { 00347 return (HSZT_INVALID); 00348 } 00349 if (HIWORD((ULONG_PTR)hsz) == 0) { 00350 return (HSZT_NORMAL); 00351 } 00352 if (HIWORD((ULONG_PTR)hsz) == 1) { 00353 return (HSZT_INST_SPECIFIC); 00354 } 00355 return (HSZT_INVALID); 00356 } 00357 00358 /***************************************************************************\ 00359 * MakeInstSpecificAtom 00360 * 00361 * Description: 00362 * Creates a new atom that has hwnd imbeded into it. 00363 * 00364 * History: 00365 * 11-1-91 sanfords Created. 00366 \***************************************************************************/ 00367 LATOM MakeInstSpecificAtom( 00368 LATOM la, 00369 HWND hwnd) 00370 { 00371 WCHAR sz[256]; 00372 LPWSTR psz; 00373 00374 if (GetAtomName(la, sz, 256) == 0) { 00375 return (0); 00376 } 00377 #ifdef UNICODE 00378 psz = sz + wcslen(sz); 00379 #else 00380 psz = sz + strlen(sz); 00381 #endif 00382 wsprintf(psz, TEXT("(%#p)"), hwnd); 00383 la = AddAtom(sz); 00384 return (la); 00385 } 00386 00387 00388 00389 /***************************************************************************\ 00390 * ParseInstSpecificAtom 00391 * 00392 * Description: 00393 * Extracts the hwnd value out of the atom. 00394 * 00395 * History: 00396 * 11-1-91 sanfords Created. 00397 \***************************************************************************/ 00398 HWND ParseInstSpecificAtom( 00399 LATOM la, 00400 LATOM *plaNormal) 00401 { 00402 CHAR sz[256]; 00403 LPSTR pszHwnd; 00404 HWND hwnd; 00405 00406 /* 00407 * LATER- NEED TO MAKE THIS UNICODE BASED WHEN WE GET A SCANF WE CAN USE 00408 */ 00409 if (GetAtomNameA(la, sz, 256) == 0) { 00410 return (0); 00411 } 00412 pszHwnd = strrchr(sz, '('); 00413 if (pszHwnd == NULL) { 00414 return (0); 00415 } 00416 if (sscanf(pszHwnd, "(%#p)", &hwnd) != 1) { 00417 return (0); 00418 } 00419 if (plaNormal != NULL) { 00420 *pszHwnd = '\0'; 00421 *plaNormal = AddAtomA(sz); 00422 } 00423 return (hwnd); 00424 } 00425 00426 00427 00428 00429 /***************************************************************************\ 00430 * LocalToGlobalAtom 00431 * 00432 * Description: 00433 * Converts a Local Atom to a Global Atom 00434 * 00435 * History: 00436 * 12-1-91 sanfords Created. 00437 \***************************************************************************/ 00438 GATOM LocalToGlobalAtom( 00439 LATOM la) 00440 { 00441 WCHAR sz[256]; 00442 00443 if (la == 0) { 00444 return (0); 00445 } 00446 if (GetAtomName((ATOM)la, sz, 256) == 0) { 00447 RIPMSG0(RIP_WARNING, "LocalToGlobalAtom out of memory"); 00448 return (0); 00449 } 00450 return ((GATOM)GlobalAddAtom(sz)); 00451 } 00452 00453 00454 00455 /***************************************************************************\ 00456 * GlobalToLocalAtom 00457 * 00458 * Description: 00459 * Converts a Global Atom to a Local Atom 00460 * 00461 * History: 00462 * 12-1-91 sanfords Created. 00463 \***************************************************************************/ 00464 LATOM GlobalToLocalAtom( 00465 GATOM ga) 00466 { 00467 WCHAR sz[256]; 00468 00469 if (ga == 0) { 00470 return (0); 00471 } 00472 if (GlobalGetAtomName((ATOM)ga, sz, 256) == 0) { 00473 RIPMSG0(RIP_WARNING, "GlobalToLocalAtom out of memory"); 00474 return (0); 00475 } 00476 return ((LATOM)AddAtom(sz)); 00477 } 00478 00479 00480 /***************************************************************************\ 00481 * IncGlobalAtomCount 00482 * 00483 * Description: 00484 * Duplicates an atom. 00485 * 00486 * 00487 * History: 00488 * 1-22-91 sanfords Created. 00489 \***************************************************************************/ 00490 GATOM IncGlobalAtomCount( 00491 GATOM ga) 00492 { 00493 WCHAR sz[256]; 00494 00495 if (ga == 0) { 00496 return (0); 00497 } 00498 if (GlobalGetAtomName(ga, sz, 256) == 0) { 00499 RIPMSG0(RIP_WARNING, "IncGlobalAtomCount out of memory"); 00500 return (0); 00501 } 00502 return ((GATOM)GlobalAddAtom(sz)); 00503 } 00504 00505 00506 /***************************************************************************\ 00507 * IncGlobalAtomCount 00508 * 00509 * Description: 00510 * Duplicates an atom. 00511 * 00512 * 00513 * History: 00514 * 1-22-91 sanfords Created. 00515 \***************************************************************************/ 00516 LATOM IncLocalAtomCount( 00517 LATOM la) 00518 { 00519 WCHAR sz[256]; 00520 00521 if (la == 0) { 00522 return (0); 00523 } 00524 if (GetAtomName(la, sz, 256) == 0) { 00525 RIPMSG0(RIP_WARNING, "IncLocalAtomCount out of memory"); 00526 return (0); 00527 } 00528 return ((LATOM)AddAtom(sz)); 00529 }

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