00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include "precomp.h"
00013
#pragma hdrstop
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
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
00106
00107
00108
00109
00110
00111
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
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
00198
00199
00200
#ifdef LATER
00201
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
00220
00221
00222
00223
00224
00225
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
00265
00266
00267
00268
00269
00270
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
00308
00309
00310
00311
00312
00313
00314
00315
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
00333
00334
00335
00336
00337
00338
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
00360
00361
00362
00363
00364
00365
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
00391
00392
00393
00394
00395
00396
00397
00398 HWND
ParseInstSpecificAtom(
00399 LATOM la,
00400 LATOM *plaNormal)
00401 {
00402
CHAR sz[256];
00403 LPSTR pszHwnd;
00404 HWND hwnd;
00405
00406
00407
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
00431
00432
00433
00434
00435
00436
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
00457
00458
00459
00460
00461
00462
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
00482
00483
00484
00485
00486
00487
00488
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
00508
00509
00510
00511
00512
00513
00514
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 }