OLD | NEW |
(Empty) | |
| 1 // Windows Template Library - WTL version 8.0 |
| 2 // Copyright (C) Microsoft Corporation. All rights reserved. |
| 3 // |
| 4 // This file is a part of the Windows Template Library. |
| 5 // The use and distribution terms for this software are covered by the |
| 6 // Microsoft Permissive License (Ms-PL) which can be found in the file |
| 7 // Ms-PL.txt at the root of this distribution. |
| 8 |
| 9 #ifndef __ATLAPP_H__ |
| 10 #define __ATLAPP_H__ |
| 11 |
| 12 #pragma once |
| 13 |
| 14 #ifndef __cplusplus |
| 15 #error ATL requires C++ compilation (use a .cpp suffix) |
| 16 #endif |
| 17 |
| 18 #ifndef __ATLBASE_H__ |
| 19 #error atlapp.h requires atlbase.h to be included first |
| 20 #endif |
| 21 |
| 22 #ifndef _WIN32_WCE |
| 23 #if (WINVER < 0x0400) |
| 24 #error WTL requires Windows version 4.0 or higher |
| 25 #endif |
| 26 |
| 27 #if (_WIN32_IE < 0x0300) |
| 28 #error WTL requires IE version 3.0 or higher |
| 29 #endif |
| 30 #endif |
| 31 |
| 32 #ifdef _ATL_NO_COMMODULE |
| 33 #error WTL requires that _ATL_NO_COMMODULE is not defined |
| 34 #endif // _ATL_NO_COMMODULE |
| 35 |
| 36 #if defined(_WIN32_WCE) && defined(_ATL_MIN_CRT) |
| 37 #pragma message("Warning: WTL for Windows CE doesn't use _ATL_MIN_CRT") |
| 38 #endif // defined(_WIN32_WCE) && defined(_ATL_MIN_CRT) |
| 39 |
| 40 #include <limits.h> |
| 41 #if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE) |
| 42 #include <process.h> // for _beginthreadex |
| 43 #endif |
| 44 |
| 45 #if (_ATL_VER < 0x0800) && !defined(_DEBUG) |
| 46 #include <stdio.h> |
| 47 #endif |
| 48 |
| 49 #include <commctrl.h> |
| 50 #ifndef _WIN32_WCE |
| 51 #pragma comment(lib, "comctl32.lib") |
| 52 #endif // !_WIN32_WCE |
| 53 |
| 54 #ifndef _WIN32_WCE |
| 55 #include "atlres.h" |
| 56 #else // CE specific |
| 57 #include "atlresce.h" |
| 58 #endif // _WIN32_WCE |
| 59 |
| 60 // We need to disable this warning because of template class arguments |
| 61 #pragma warning(disable: 4127) |
| 62 |
| 63 |
| 64 /////////////////////////////////////////////////////////////////////////////// |
| 65 // WTL version number |
| 66 |
| 67 #define _WTL_VER 0x0800 |
| 68 |
| 69 |
| 70 /////////////////////////////////////////////////////////////////////////////// |
| 71 // Classes in this file: |
| 72 // |
| 73 // CMessageFilter |
| 74 // CIdleHandler |
| 75 // CMessageLoop |
| 76 // |
| 77 // CAppModule |
| 78 // CServerAppModule |
| 79 // |
| 80 // Global functions: |
| 81 // AtlGetDefaultGuiFont() |
| 82 // AtlCreateBoldFont() |
| 83 // AtlInitCommonControls() |
| 84 |
| 85 |
| 86 /////////////////////////////////////////////////////////////////////////////// |
| 87 // Global support for Windows CE |
| 88 |
| 89 #ifdef _WIN32_WCE |
| 90 |
| 91 #ifndef SW_SHOWDEFAULT |
| 92 #define SW_SHOWDEFAULT SW_SHOWNORMAL |
| 93 #endif // !SW_SHOWDEFAULT |
| 94 |
| 95 // These get's OR-ed in a constant and will have no effect. |
| 96 // Defining them reduces the number of #ifdefs required for CE. |
| 97 #define LR_DEFAULTSIZE 0 |
| 98 #define LR_LOADFROMFILE 0 |
| 99 |
| 100 #ifndef SM_CXCURSOR |
| 101 #define SM_CXCURSOR 13 |
| 102 #endif |
| 103 #ifndef SM_CYCURSOR |
| 104 #define SM_CYCURSOR 14 |
| 105 #endif |
| 106 |
| 107 inline BOOL IsMenu(HMENU hMenu) |
| 108 { |
| 109 MENUITEMINFO mii = { sizeof(MENUITEMINFO) }; |
| 110 ::SetLastError(0); |
| 111 BOOL bRet = ::GetMenuItemInfo(hMenu, 0, TRUE, &mii); |
| 112 if(!bRet) |
| 113 bRet = (::GetLastError() != ERROR_INVALID_MENU_HANDLE) ? TRUE :
FALSE; |
| 114 return bRet; |
| 115 } |
| 116 |
| 117 #if (_WIN32_WCE >= 410) |
| 118 extern "C" void WINAPI ListView_SetItemSpacing(HWND hwndLV, int iHeight); |
| 119 #endif // (_WIN32_WCE >= 410) |
| 120 |
| 121 inline int MulDiv(IN int nNumber, IN int nNumerator, IN int nDenominator) |
| 122 { |
| 123 __int64 multiple = nNumber * nNumerator; |
| 124 return static_cast<int>(multiple / nDenominator); |
| 125 } |
| 126 |
| 127 #if (_ATL_VER >= 0x0800) |
| 128 |
| 129 #ifndef _WTL_KEEP_WS_OVERLAPPEDWINDOW |
| 130 #ifdef WS_OVERLAPPEDWINDOW |
| 131 #undef WS_OVERLAPPEDWINDOW |
| 132 #define WS_OVERLAPPEDWINDOW 0 |
| 133 #endif // WS_OVERLAPPEDWINDOW |
| 134 #endif // !_WTL_KEEP_WS_OVERLAPPEDWINDOW |
| 135 |
| 136 #ifndef RDW_FRAME |
| 137 #define RDW_FRAME 0 |
| 138 #endif // !RDW_FRAME |
| 139 |
| 140 #ifndef WM_WINDOWPOSCHANGING |
| 141 #define WM_WINDOWPOSCHANGING 0 |
| 142 #endif // !WM_WINDOWPOSCHANGING |
| 143 |
| 144 #define FreeResource(x) |
| 145 #define UnlockResource(x) |
| 146 |
| 147 namespace ATL |
| 148 { |
| 149 inline HRESULT CComModule::RegisterClassObjects(DWORD /*dwClsContext*/, DWORD
/*dwFlags*/) throw() |
| 150 { return E_NOTIMPL; } |
| 151 inline HRESULT CComModule::RevokeClassObjects() throw() |
| 152 { return E_NOTIMPL; } |
| 153 }; // namespace ATL |
| 154 |
| 155 #ifndef lstrlenW |
| 156 #define lstrlenW (int)ATL::lstrlenW |
| 157 #endif // lstrlenW |
| 158 |
| 159 inline int WINAPI lstrlenA(LPCSTR lpszString) |
| 160 { return ATL::lstrlenA(lpszString); } |
| 161 |
| 162 #ifdef lstrcpyn |
| 163 #undef lstrcpyn |
| 164 #define lstrcpyn ATL::lstrcpynW |
| 165 #endif // lstrcpyn |
| 166 |
| 167 #ifndef SetWindowLongPtrW |
| 168 inline LONG_PTR tmp_SetWindowLongPtrW( HWND hWnd, int nIndex, LONG_PTR dwNewLo
ng ) |
| 169 { |
| 170 return( ::SetWindowLongW( hWnd, nIndex, LONG( dwNewLong ) ) ); |
| 171 } |
| 172 #define SetWindowLongPtrW tmp_SetWindowLongPtrW |
| 173 #endif |
| 174 |
| 175 #ifndef GetWindowLongPtrW |
| 176 inline LONG_PTR tmp_GetWindowLongPtrW( HWND hWnd, int nIndex ) |
| 177 { |
| 178 return( ::GetWindowLongW( hWnd, nIndex ) ); |
| 179 } |
| 180 #define GetWindowLongPtrW tmp_GetWindowLongPtrW |
| 181 #endif |
| 182 |
| 183 #ifndef LongToPtr |
| 184 #define LongToPtr(x) ((void*)x) |
| 185 #endif |
| 186 |
| 187 #ifndef PtrToInt |
| 188 #define PtrToInt( p ) ((INT)(INT_PTR) (p) ) |
| 189 #endif |
| 190 |
| 191 #else // !(_ATL_VER >= 0x0800) |
| 192 |
| 193 #ifdef lstrlenW |
| 194 #undef lstrlenW |
| 195 #define lstrlenW (int)::wcslen |
| 196 #endif // lstrlenW |
| 197 |
| 198 #define lstrlenA (int)strlen |
| 199 |
| 200 #ifndef lstrcpyn |
| 201 inline LPTSTR lstrcpyn(LPTSTR lpstrDest, LPCTSTR lpstrSrc, int nLength) |
| 202 { |
| 203 if(lpstrDest == NULL || lpstrSrc == NULL || nLength <= 0) |
| 204 return NULL; |
| 205 int nLen = __min(lstrlen(lpstrSrc), nLength - 1); |
| 206 LPTSTR lpstrRet = (LPTSTR)memcpy(lpstrDest, lpstrSrc, nLen * sizeof(TCHA
R)); |
| 207 lpstrDest[nLen] = 0; |
| 208 return lpstrRet; |
| 209 } |
| 210 #endif // !lstrcpyn |
| 211 |
| 212 #ifndef lstrcpynW |
| 213 inline LPWSTR lstrcpynW(LPWSTR lpstrDest, LPCWSTR lpstrSrc, int nLength) |
| 214 { |
| 215 return lstrcpyn(lpstrDest, lpstrSrc, nLength); // WinCE is Unicode onl
y |
| 216 } |
| 217 #endif // !lstrcpynW |
| 218 |
| 219 #ifndef lstrcpynA |
| 220 inline LPSTR lstrcpynA(LPSTR lpstrDest, LPCSTR lpstrSrc, int nLength) |
| 221 { |
| 222 if(lpstrDest == NULL || lpstrSrc == NULL || nLength <= 0) |
| 223 return NULL; |
| 224 int nLen = __min(lstrlenA(lpstrSrc), nLength - 1); |
| 225 LPSTR lpstrRet = (LPSTR)memcpy(lpstrDest, lpstrSrc, nLen * sizeof(char))
; |
| 226 lpstrDest[nLen] = 0; |
| 227 return lpstrRet; |
| 228 } |
| 229 #endif // !lstrcpyn |
| 230 |
| 231 #ifdef TrackPopupMenu |
| 232 #undef TrackPopupMenu |
| 233 #endif // TrackPopupMenu |
| 234 |
| 235 #define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd) \ |
| 236 static CWndClassInfo& GetWndClassInfo() \ |
| 237 { \ |
| 238 static CWndClassInfo wc = \ |
| 239 { \ |
| 240 { style, StartWindowProc, \ |
| 241 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassNam
e }, \ |
| 242 NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \ |
| 243 }; \ |
| 244 return wc; \ |
| 245 } |
| 246 |
| 247 #ifndef _MAX_FNAME |
| 248 #define _MAX_FNAME _MAX_PATH |
| 249 #endif // _MAX_FNAME |
| 250 |
| 251 #if (_WIN32_WCE < 400) |
| 252 #define MAKEINTATOM(i) (LPTSTR)((ULONG_PTR)((WORD)(i))) |
| 253 #endif // (_WIN32_WCE < 400) |
| 254 |
| 255 #if (_WIN32_WCE < 410) |
| 256 #define WHEEL_PAGESCROLL (UINT_MAX) |
| 257 #define WHEEL_DELTA 120 |
| 258 #endif // (_WIN32_WCE < 410) |
| 259 |
| 260 #ifdef DrawIcon |
| 261 #undef DrawIcon |
| 262 #endif |
| 263 |
| 264 #ifndef VARCMP_LT |
| 265 #define VARCMP_LT 0 |
| 266 #endif |
| 267 #ifndef VARCMP_EQ |
| 268 #define VARCMP_EQ 1 |
| 269 #endif |
| 270 #ifndef VARCMP_GT |
| 271 #define VARCMP_GT 2 |
| 272 #endif |
| 273 #ifndef VARCMP_NULL |
| 274 #define VARCMP_NULL 3 |
| 275 #endif |
| 276 |
| 277 #ifndef RDW_ALLCHILDREN |
| 278 #define RDW_ALLCHILDREN 0 |
| 279 #endif |
| 280 |
| 281 #endif // !(_ATL_VER >= 0x0800) |
| 282 |
| 283 #endif // _WIN32_WCE |
| 284 |
| 285 |
| 286 /////////////////////////////////////////////////////////////////////////////// |
| 287 // Global support for using original VC++ 6.0 headers with WTL |
| 288 |
| 289 #ifndef _ATL_NO_OLD_HEADERS_WIN64 |
| 290 #if !defined(_WIN64) && (_ATL_VER < 0x0700) |
| 291 |
| 292 #ifndef PSM_INSERTPAGE |
| 293 #define PSM_INSERTPAGE (WM_USER + 119) |
| 294 #endif // !PSM_INSERTPAGE |
| 295 |
| 296 #ifndef GetClassLongPtr |
| 297 #define GetClassLongPtrA GetClassLongA |
| 298 #define GetClassLongPtrW GetClassLongW |
| 299 #ifdef UNICODE |
| 300 #define GetClassLongPtr GetClassLongPtrW |
| 301 #else |
| 302 #define GetClassLongPtr GetClassLongPtrA |
| 303 #endif // !UNICODE |
| 304 #endif // !GetClassLongPtr |
| 305 |
| 306 #ifndef GCLP_HICONSM |
| 307 #define GCLP_HICONSM (-34) |
| 308 #endif // !GCLP_HICONSM |
| 309 |
| 310 #ifndef GetWindowLongPtr |
| 311 #define GetWindowLongPtrA GetWindowLongA |
| 312 #define GetWindowLongPtrW GetWindowLongW |
| 313 #ifdef UNICODE |
| 314 #define GetWindowLongPtr GetWindowLongPtrW |
| 315 #else |
| 316 #define GetWindowLongPtr GetWindowLongPtrA |
| 317 #endif // !UNICODE |
| 318 #endif // !GetWindowLongPtr |
| 319 |
| 320 #ifndef SetWindowLongPtr |
| 321 #define SetWindowLongPtrA SetWindowLongA |
| 322 #define SetWindowLongPtrW SetWindowLongW |
| 323 #ifdef UNICODE |
| 324 #define SetWindowLongPtr SetWindowLongPtrW |
| 325 #else |
| 326 #define SetWindowLongPtr SetWindowLongPtrA |
| 327 #endif // !UNICODE |
| 328 #endif // !SetWindowLongPtr |
| 329 |
| 330 #ifndef GWLP_WNDPROC |
| 331 #define GWLP_WNDPROC (-4) |
| 332 #endif |
| 333 #ifndef GWLP_HINSTANCE |
| 334 #define GWLP_HINSTANCE (-6) |
| 335 #endif |
| 336 #ifndef GWLP_HWNDPARENT |
| 337 #define GWLP_HWNDPARENT (-8) |
| 338 #endif |
| 339 #ifndef GWLP_USERDATA |
| 340 #define GWLP_USERDATA (-21) |
| 341 #endif |
| 342 #ifndef GWLP_ID |
| 343 #define GWLP_ID (-12) |
| 344 #endif |
| 345 |
| 346 #ifndef DWLP_MSGRESULT |
| 347 #define DWLP_MSGRESULT 0 |
| 348 #endif |
| 349 |
| 350 typedef long LONG_PTR; |
| 351 typedef unsigned long ULONG_PTR; |
| 352 typedef ULONG_PTR DWORD_PTR; |
| 353 |
| 354 #ifndef HandleToUlong |
| 355 #define HandleToUlong( h ) ((ULONG)(ULONG_PTR)(h) ) |
| 356 #endif |
| 357 #ifndef HandleToLong |
| 358 #define HandleToLong( h ) ((LONG)(LONG_PTR) (h) ) |
| 359 #endif |
| 360 #ifndef LongToHandle |
| 361 #define LongToHandle( h) ((HANDLE)(LONG_PTR) (h)) |
| 362 #endif |
| 363 #ifndef PtrToUlong |
| 364 #define PtrToUlong( p ) ((ULONG)(ULONG_PTR) (p) ) |
| 365 #endif |
| 366 #ifndef PtrToLong |
| 367 #define PtrToLong( p ) ((LONG)(LONG_PTR) (p) ) |
| 368 #endif |
| 369 #ifndef PtrToUint |
| 370 #define PtrToUint( p ) ((UINT)(UINT_PTR) (p) ) |
| 371 #endif |
| 372 #ifndef PtrToInt |
| 373 #define PtrToInt( p ) ((INT)(INT_PTR) (p) ) |
| 374 #endif |
| 375 #ifndef PtrToUshort |
| 376 #define PtrToUshort( p ) ((unsigned short)(ULONG_PTR)(p) ) |
| 377 #endif |
| 378 #ifndef PtrToShort |
| 379 #define PtrToShort( p ) ((short)(LONG_PTR)(p) ) |
| 380 #endif |
| 381 #ifndef IntToPtr |
| 382 #define IntToPtr( i ) ((VOID *)(INT_PTR)((int)i)) |
| 383 #endif |
| 384 #ifndef UIntToPtr |
| 385 #define UIntToPtr( ui ) ((VOID *)(UINT_PTR)((unsigned int)ui)) |
| 386 #endif |
| 387 #ifndef LongToPtr |
| 388 #define LongToPtr( l ) ((VOID *)(LONG_PTR)((long)l)) |
| 389 #endif |
| 390 #ifndef ULongToPtr |
| 391 #define ULongToPtr( ul ) ((VOID *)(ULONG_PTR)((unsigned long)ul)) |
| 392 #endif |
| 393 |
| 394 #endif // !defined(_WIN64) && (_ATL_VER < 0x0700) |
| 395 #endif // !_ATL_NO_OLD_HEADERS_WIN64 |
| 396 |
| 397 |
| 398 /////////////////////////////////////////////////////////////////////////////// |
| 399 // Global support for SecureHelper functions |
| 400 |
| 401 #ifndef _TRUNCATE |
| 402 #define _TRUNCATE ((size_t)-1) |
| 403 #endif |
| 404 |
| 405 #ifndef _ERRCODE_DEFINED |
| 406 #define _ERRCODE_DEFINED |
| 407 typedef int errno_t; |
| 408 #endif |
| 409 |
| 410 #ifndef _SECURECRT_ERRCODE_VALUES_DEFINED |
| 411 #define _SECURECRT_ERRCODE_VALUES_DEFINED |
| 412 #define EINVAL 22 |
| 413 #define STRUNCATE 80 |
| 414 #endif |
| 415 |
| 416 #ifndef _countof |
| 417 #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) |
| 418 #endif |
| 419 |
| 420 |
| 421 /////////////////////////////////////////////////////////////////////////////// |
| 422 // Miscellaneous global support |
| 423 |
| 424 // define useful macros from winuser.h |
| 425 #ifndef IS_INTRESOURCE |
| 426 #define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0) |
| 427 #endif // IS_INTRESOURCE |
| 428 |
| 429 // protect template members from windowsx.h macros |
| 430 #ifdef _INC_WINDOWSX |
| 431 #undef SubclassWindow |
| 432 #endif // _INC_WINDOWSX |
| 433 |
| 434 // define useful macros from windowsx.h |
| 435 #ifndef GET_X_LPARAM |
| 436 #define GET_X_LPARAM(lParam) ((int)(short)LOWORD(lParam)) |
| 437 #endif |
| 438 #ifndef GET_Y_LPARAM |
| 439 #define GET_Y_LPARAM(lParam) ((int)(short)HIWORD(lParam)) |
| 440 #endif |
| 441 |
| 442 // Dummy structs for compiling with /CLR |
| 443 #if (_MSC_VER >= 1300) && defined(_MANAGED) |
| 444 __if_not_exists(_IMAGELIST::_IMAGELIST) { struct _IMAGELIST { }; } |
| 445 __if_not_exists(_TREEITEM::_TREEITEM) { struct _TREEITEM { }; } |
| 446 __if_not_exists(_PSP::_PSP) { struct _PSP { }; } |
| 447 #endif |
| 448 |
| 449 // Define ATLVERIFY macro for ATL3 |
| 450 #if (_ATL_VER < 0x0700) |
| 451 #ifndef ATLVERIFY |
| 452 #ifdef _DEBUG |
| 453 #define ATLVERIFY(expr) ATLASSERT(expr) |
| 454 #else |
| 455 #define ATLVERIFY(expr) (expr) |
| 456 #endif // DEBUG |
| 457 #endif // ATLVERIFY |
| 458 #endif // (_ATL_VER < 0x0700) |
| 459 |
| 460 // Forward declaration for ATL3 and ATL11 fix |
| 461 #if (((_ATL_VER < 0x0700) && defined(_ATL_DLL)) || (_ATL_VER >= 0x0B00)) && !def
ined(_WIN32_WCE) |
| 462 namespace ATL { HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMin
or); }; |
| 463 #endif |
| 464 |
| 465 |
| 466 namespace WTL |
| 467 { |
| 468 |
| 469 #if (_ATL_VER >= 0x0700) |
| 470 DECLARE_TRACE_CATEGORY(atlTraceUI); |
| 471 #ifdef _DEBUG |
| 472 __declspec(selectany) ATL::CTraceCategory atlTraceUI(_T("atlTraceUI")); |
| 473 #endif // _DEBUG |
| 474 #else // !(_ATL_VER >= 0x0700) |
| 475 enum wtlTraceFlags |
| 476 { |
| 477 atlTraceUI = 0x10000000 |
| 478 }; |
| 479 #endif // !(_ATL_VER >= 0x0700) |
| 480 |
| 481 // Windows version helper |
| 482 inline bool AtlIsOldWindows() |
| 483 { |
| 484 OSVERSIONINFO ovi = { 0 }; |
| 485 ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); |
| 486 BOOL bRet = ::GetVersionEx(&ovi); |
| 487 return (!bRet || !((ovi.dwMajorVersion >= 5) || (ovi.dwMajorVersion == 4
&& ovi.dwMinorVersion >= 90))); |
| 488 } |
| 489 |
| 490 // default GUI font helper |
| 491 inline HFONT AtlGetDefaultGuiFont() |
| 492 { |
| 493 #ifndef _WIN32_WCE |
| 494 return (HFONT)::GetStockObject(DEFAULT_GUI_FONT); |
| 495 #else // CE specific |
| 496 return (HFONT)::GetStockObject(SYSTEM_FONT); |
| 497 #endif // _WIN32_WCE |
| 498 } |
| 499 |
| 500 // bold font helper (NOTE: Caller owns the font, and should destroy it when done
using it) |
| 501 inline HFONT AtlCreateBoldFont(HFONT hFont = NULL) |
| 502 { |
| 503 if(hFont == NULL) |
| 504 hFont = AtlGetDefaultGuiFont(); |
| 505 ATLASSERT(hFont != NULL); |
| 506 HFONT hFontBold = NULL; |
| 507 LOGFONT lf = { 0 }; |
| 508 if(::GetObject(hFont, sizeof(LOGFONT), &lf) == sizeof(LOGFONT)) |
| 509 { |
| 510 lf.lfWeight = FW_BOLD; |
| 511 hFontBold = ::CreateFontIndirect(&lf); |
| 512 ATLASSERT(hFontBold != NULL); |
| 513 } |
| 514 else |
| 515 { |
| 516 ATLASSERT(FALSE); |
| 517 } |
| 518 return hFontBold; |
| 519 } |
| 520 |
| 521 // Common Controls initialization helper |
| 522 inline BOOL AtlInitCommonControls(DWORD dwFlags) |
| 523 { |
| 524 INITCOMMONCONTROLSEX iccx = { sizeof(INITCOMMONCONTROLSEX), dwFlags }; |
| 525 BOOL bRet = ::InitCommonControlsEx(&iccx); |
| 526 ATLASSERT(bRet); |
| 527 return bRet; |
| 528 } |
| 529 |
| 530 |
| 531 /////////////////////////////////////////////////////////////////////////////// |
| 532 // RunTimeHelper - helper functions for Windows version and structure sizes |
| 533 |
| 534 // Not for Windows CE |
| 535 #if defined(_WIN32_WCE) && !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) |
| 536 #define _WTL_NO_RUNTIME_STRUCT_SIZE |
| 537 #endif |
| 538 |
| 539 #ifndef _WTL_NO_RUNTIME_STRUCT_SIZE |
| 540 |
| 541 #ifndef _SIZEOF_STRUCT |
| 542 #define _SIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)
->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member)) |
| 543 #endif |
| 544 |
| 545 #if (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE) |
| 546 #define REBARBANDINFO_V6_SIZE _SIZEOF_STRUCT(REBARBANDINFO, cxHeader) |
| 547 #endif // (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE) |
| 548 |
| 549 #if (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE) |
| 550 #define LVGROUP_V5_SIZE _SIZEOF_STRUCT(LVGROUP, uAlign) |
| 551 #endif // (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE) |
| 552 |
| 553 #if (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE) |
| 554 #define LVTILEINFO_V5_SIZE _SIZEOF_STRUCT(LVTILEINFO, puColumns) |
| 555 #endif // (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE) |
| 556 |
| 557 #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !defined(MCHI
TTESTINFO_V1_SIZE) |
| 558 #define MCHITTESTINFO_V1_SIZE _SIZEOF_STRUCT(MCHITTESTINFO, st) |
| 559 #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !define
d(MCHITTESTINFO_V1_SIZE) |
| 560 |
| 561 #if !defined(_WIN32_WCE) && (WINVER >= 0x0600) && !defined(NONCLIENTMETRICS_V1_S
IZE) |
| 562 #define NONCLIENTMETRICS_V1_SIZE _SIZEOF_STRUCT(NONCLIENTMETRICS, lfMessageF
ont) |
| 563 #endif // !defined(_WIN32_WCE) && (WINVER >= 0x0600) && !defined(NONCLIENTMETRIC
S_V1_SIZE) |
| 564 |
| 565 #endif // !_WTL_NO_RUNTIME_STRUCT_SIZE |
| 566 |
| 567 namespace RunTimeHelper |
| 568 { |
| 569 #ifndef _WIN32_WCE |
| 570 inline bool IsCommCtrl6() |
| 571 { |
| 572 DWORD dwMajor = 0, dwMinor = 0; |
| 573 HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor); |
| 574 return (SUCCEEDED(hRet) && (dwMajor >= 6)); |
| 575 } |
| 576 |
| 577 inline bool IsVista() |
| 578 { |
| 579 OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) }; |
| 580 BOOL bRet = ::GetVersionEx(&ovi); |
| 581 return ((bRet != FALSE) && (ovi.dwMajorVersion >= 6)); |
| 582 } |
| 583 #endif // !_WIN32_WCE |
| 584 |
| 585 inline int SizeOf_REBARBANDINFO() |
| 586 { |
| 587 int nSize = sizeof(REBARBANDINFO); |
| 588 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) |
| 589 if(!(IsVista() && IsCommCtrl6())) |
| 590 nSize = REBARBANDINFO_V6_SIZE; |
| 591 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) |
| 592 return nSize; |
| 593 } |
| 594 |
| 595 #if (_WIN32_WINNT >= 0x501) |
| 596 inline int SizeOf_LVGROUP() |
| 597 { |
| 598 int nSize = sizeof(LVGROUP); |
| 599 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) |
| 600 if(!IsVista()) |
| 601 nSize = LVGROUP_V5_SIZE; |
| 602 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) |
| 603 return nSize; |
| 604 } |
| 605 |
| 606 inline int SizeOf_LVTILEINFO() |
| 607 { |
| 608 int nSize = sizeof(LVTILEINFO); |
| 609 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) |
| 610 if(!IsVista()) |
| 611 nSize = LVTILEINFO_V5_SIZE; |
| 612 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) |
| 613 return nSize; |
| 614 } |
| 615 #endif // (_WIN32_WINNT >= 0x501) |
| 616 |
| 617 inline int SizeOf_MCHITTESTINFO() |
| 618 { |
| 619 int nSize = sizeof(MCHITTESTINFO); |
| 620 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NTDDI_VE
RSION >= NTDDI_LONGHORN) |
| 621 if(!(IsVista() && IsCommCtrl6())) |
| 622 nSize = MCHITTESTINFO_V1_SIZE; |
| 623 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NT
DDI_VERSION >= NTDDI_LONGHORN) |
| 624 return nSize; |
| 625 } |
| 626 |
| 627 #ifndef _WIN32_WCE |
| 628 inline int SizeOf_NONCLIENTMETRICS() |
| 629 { |
| 630 int nSize = sizeof(NONCLIENTMETRICS); |
| 631 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600) |
| 632 if(!IsVista()) |
| 633 nSize = NONCLIENTMETRICS_V1_SIZE; |
| 634 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600) |
| 635 return nSize; |
| 636 } |
| 637 #endif // !_WIN32_WCE |
| 638 }; |
| 639 |
| 640 |
| 641 /////////////////////////////////////////////////////////////////////////////// |
| 642 // ModuleHelper - helper functions for ATL3 and ATL7 module classes |
| 643 |
| 644 namespace ModuleHelper |
| 645 { |
| 646 inline HINSTANCE GetModuleInstance() |
| 647 { |
| 648 #if (_ATL_VER >= 0x0700) |
| 649 return ATL::_AtlBaseModule.GetModuleInstance(); |
| 650 #else // !(_ATL_VER >= 0x0700) |
| 651 return ATL::_pModule->GetModuleInstance(); |
| 652 #endif // !(_ATL_VER >= 0x0700) |
| 653 } |
| 654 |
| 655 inline HINSTANCE GetResourceInstance() |
| 656 { |
| 657 #if (_ATL_VER >= 0x0700) |
| 658 return ATL::_AtlBaseModule.GetResourceInstance(); |
| 659 #else // !(_ATL_VER >= 0x0700) |
| 660 return ATL::_pModule->GetResourceInstance(); |
| 661 #endif // !(_ATL_VER >= 0x0700) |
| 662 } |
| 663 |
| 664 inline void AddCreateWndData(ATL::_AtlCreateWndData* pData, void* pObjec
t) |
| 665 { |
| 666 #if (_ATL_VER >= 0x0700) |
| 667 ATL::_AtlWinModule.AddCreateWndData(pData, pObject); |
| 668 #else // !(_ATL_VER >= 0x0700) |
| 669 ATL::_pModule->AddCreateWndData(pData, pObject); |
| 670 #endif // !(_ATL_VER >= 0x0700) |
| 671 } |
| 672 |
| 673 inline void* ExtractCreateWndData() |
| 674 { |
| 675 #if (_ATL_VER >= 0x0700) |
| 676 return ATL::_AtlWinModule.ExtractCreateWndData(); |
| 677 #else // !(_ATL_VER >= 0x0700) |
| 678 return ATL::_pModule->ExtractCreateWndData(); |
| 679 #endif // !(_ATL_VER >= 0x0700) |
| 680 } |
| 681 }; |
| 682 |
| 683 |
| 684 /////////////////////////////////////////////////////////////////////////////// |
| 685 // SecureHelper - helper functions for VS2005 secure CRT |
| 686 |
| 687 namespace SecureHelper |
| 688 { |
| 689 inline void strcpyA_x(char* lpstrDest, size_t cchDest, const char* lpstr
Src) |
| 690 { |
| 691 #if _SECURE_ATL |
| 692 ATL::Checked::strcpy_s(lpstrDest, cchDest, lpstrSrc); |
| 693 #else |
| 694 if(cchDest > (size_t)lstrlenA(lpstrSrc)) |
| 695 ATLVERIFY(lstrcpyA(lpstrDest, lpstrSrc) != NULL); |
| 696 else |
| 697 ATLASSERT(FALSE); |
| 698 #endif |
| 699 } |
| 700 |
| 701 inline void strcpyW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t*
lpstrSrc) |
| 702 { |
| 703 #if _SECURE_ATL |
| 704 ATL::Checked::wcscpy_s(lpstrDest, cchDest, lpstrSrc); |
| 705 #else |
| 706 if(cchDest > (size_t)lstrlenW(lpstrSrc)) |
| 707 ATLVERIFY(lstrcpyW(lpstrDest, lpstrSrc) != NULL); |
| 708 else |
| 709 ATLASSERT(FALSE); |
| 710 #endif |
| 711 } |
| 712 |
| 713 inline void strcpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc) |
| 714 { |
| 715 #ifdef _UNICODE |
| 716 strcpyW_x(lpstrDest, cchDest, lpstrSrc); |
| 717 #else |
| 718 strcpyA_x(lpstrDest, cchDest, lpstrSrc); |
| 719 #endif |
| 720 } |
| 721 |
| 722 inline errno_t strncpyA_x(char* lpstrDest, size_t cchDest, const char* l
pstrSrc, size_t cchCount) |
| 723 { |
| 724 #if _SECURE_ATL |
| 725 return ATL::Checked::strncpy_s(lpstrDest, cchDest, lpstrSrc, cch
Count); |
| 726 #else |
| 727 errno_t nRet = 0; |
| 728 if(lpstrDest == NULL || cchDest == 0 || lpstrSrc == NULL) |
| 729 { |
| 730 nRet = EINVAL; |
| 731 } |
| 732 else if(cchCount == _TRUNCATE) |
| 733 { |
| 734 cchCount = __min(cchDest - 1, size_t(lstrlenA(lpstrSrc))
); |
| 735 nRet = STRUNCATE; |
| 736 } |
| 737 else if(cchDest <= cchCount) |
| 738 { |
| 739 lpstrDest[0] = 0; |
| 740 nRet = EINVAL; |
| 741 } |
| 742 if(nRet == 0 || nRet == STRUNCATE) |
| 743 nRet = (lstrcpynA(lpstrDest, lpstrSrc, (int)cchCount + 1
) != NULL) ? nRet : EINVAL; |
| 744 ATLASSERT(nRet == 0 || nRet == STRUNCATE); |
| 745 return nRet; |
| 746 #endif |
| 747 } |
| 748 |
| 749 inline errno_t strncpyW_x(wchar_t* lpstrDest, size_t cchDest, const wcha
r_t* lpstrSrc, size_t cchCount) |
| 750 { |
| 751 #if _SECURE_ATL |
| 752 return ATL::Checked::wcsncpy_s(lpstrDest, cchDest, lpstrSrc, cch
Count); |
| 753 #else |
| 754 errno_t nRet = 0; |
| 755 if(lpstrDest == NULL || cchDest == 0 || lpstrSrc == NULL) |
| 756 { |
| 757 nRet = EINVAL; |
| 758 } |
| 759 else if(cchCount == _TRUNCATE) |
| 760 { |
| 761 cchCount = __min(cchDest - 1, size_t(lstrlenW(lpstrSrc))
); |
| 762 nRet = STRUNCATE; |
| 763 } |
| 764 else if(cchDest <= cchCount) |
| 765 { |
| 766 lpstrDest[0] = 0; |
| 767 nRet = EINVAL; |
| 768 } |
| 769 if(nRet == 0 || nRet == STRUNCATE) |
| 770 nRet = (lstrcpynW(lpstrDest, lpstrSrc, (int)cchCount + 1
) != NULL) ? nRet : EINVAL; |
| 771 ATLASSERT(nRet == 0 || nRet == STRUNCATE); |
| 772 return nRet; |
| 773 #endif |
| 774 } |
| 775 |
| 776 inline errno_t strncpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstr
Src, size_t cchCount) |
| 777 { |
| 778 #ifdef _UNICODE |
| 779 return strncpyW_x(lpstrDest, cchDest, lpstrSrc, cchCount); |
| 780 #else |
| 781 return strncpyA_x(lpstrDest, cchDest, lpstrSrc, cchCount); |
| 782 #endif |
| 783 } |
| 784 |
| 785 inline void strcatA_x(char* lpstrDest, size_t cchDest, const char* lpstr
Src) |
| 786 { |
| 787 #if _SECURE_ATL |
| 788 ATL::Checked::strcat_s(lpstrDest, cchDest, lpstrSrc); |
| 789 #else |
| 790 if(cchDest > (size_t)lstrlenA(lpstrSrc)) |
| 791 ATLVERIFY(lstrcatA(lpstrDest, lpstrSrc) != NULL); |
| 792 else |
| 793 ATLASSERT(FALSE); |
| 794 #endif |
| 795 } |
| 796 |
| 797 inline void strcatW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t*
lpstrSrc) |
| 798 { |
| 799 #if _SECURE_ATL |
| 800 ATL::Checked::wcscat_s(lpstrDest, cchDest, lpstrSrc); |
| 801 #else |
| 802 if(cchDest > (size_t)lstrlenW(lpstrSrc)) |
| 803 ATLVERIFY(lstrcatW(lpstrDest, lpstrSrc) != NULL); |
| 804 else |
| 805 ATLASSERT(FALSE); |
| 806 #endif |
| 807 } |
| 808 |
| 809 inline void strcat_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc) |
| 810 { |
| 811 #ifdef _UNICODE |
| 812 strcatW_x(lpstrDest, cchDest, lpstrSrc); |
| 813 #else |
| 814 strcatA_x(lpstrDest, cchDest, lpstrSrc); |
| 815 #endif |
| 816 } |
| 817 |
| 818 inline void memcpy_x(void* pDest, size_t cbDest, const void* pSrc, size_
t cbSrc) |
| 819 { |
| 820 #if _SECURE_ATL |
| 821 ATL::Checked::memcpy_s(pDest, cbDest, pSrc, cbSrc); |
| 822 #else |
| 823 if(cbDest >= cbSrc) |
| 824 memcpy(pDest, pSrc, cbSrc); |
| 825 else |
| 826 ATLASSERT(FALSE); |
| 827 #endif |
| 828 } |
| 829 |
| 830 inline void memmove_x(void* pDest, size_t cbDest, const void* pSrc, size
_t cbSrc) |
| 831 { |
| 832 #if _SECURE_ATL |
| 833 ATL::Checked::memmove_s(pDest, cbDest, pSrc, cbSrc); |
| 834 #else |
| 835 if(cbDest >= cbSrc) |
| 836 memmove(pDest, pSrc, cbSrc); |
| 837 else |
| 838 ATLASSERT(FALSE); |
| 839 #endif |
| 840 } |
| 841 |
| 842 inline int vsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFor
mat, va_list args) |
| 843 { |
| 844 #if _SECURE_ATL && !defined(_ATL_MIN_CRT) && !defined(_WIN32_WCE) |
| 845 return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args); |
| 846 #else |
| 847 cchBuff; // Avoid unused argument warning |
| 848 return _vstprintf(lpstrBuff, lpstrFormat, args); |
| 849 #endif |
| 850 } |
| 851 |
| 852 inline int wvsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFo
rmat, va_list args) |
| 853 { |
| 854 #if _SECURE_ATL && !defined(_ATL_MIN_CRT) && !defined(_WIN32_WCE) |
| 855 return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args); |
| 856 #else |
| 857 cchBuff; // Avoid unused argument warning |
| 858 return ::wvsprintf(lpstrBuff, lpstrFormat, args); |
| 859 #endif |
| 860 } |
| 861 |
| 862 inline int sprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrForm
at, ...) |
| 863 { |
| 864 va_list args; |
| 865 va_start(args, lpstrFormat); |
| 866 int nRes = vsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args); |
| 867 va_end(args); |
| 868 return nRes; |
| 869 } |
| 870 |
| 871 inline int wsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFor
mat, ...) |
| 872 { |
| 873 va_list args; |
| 874 va_start(args, lpstrFormat); |
| 875 int nRes = wvsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args); |
| 876 va_end(args); |
| 877 return nRes; |
| 878 } |
| 879 }; // namespace SecureHelper |
| 880 |
| 881 |
| 882 /////////////////////////////////////////////////////////////////////////////// |
| 883 // CMessageFilter - Interface for message filter support |
| 884 |
| 885 class CMessageFilter |
| 886 { |
| 887 public: |
| 888 virtual BOOL PreTranslateMessage(MSG* pMsg) = 0; |
| 889 }; |
| 890 |
| 891 |
| 892 /////////////////////////////////////////////////////////////////////////////// |
| 893 // CIdleHandler - Interface for idle processing |
| 894 |
| 895 class CIdleHandler |
| 896 { |
| 897 public: |
| 898 virtual BOOL OnIdle() = 0; |
| 899 }; |
| 900 |
| 901 #ifndef _ATL_NO_OLD_NAMES |
| 902 // for compatilibility with old names only |
| 903 typedef CIdleHandler CUpdateUIObject; |
| 904 #define DoUpdate OnIdle |
| 905 #endif // !_ATL_NO_OLD_NAMES |
| 906 |
| 907 |
| 908 /////////////////////////////////////////////////////////////////////////////// |
| 909 // CMessageLoop - message loop implementation |
| 910 |
| 911 class CMessageLoop |
| 912 { |
| 913 public: |
| 914 ATL::CSimpleArray<CMessageFilter*> m_aMsgFilter; |
| 915 ATL::CSimpleArray<CIdleHandler*> m_aIdleHandler; |
| 916 MSG m_msg; |
| 917 |
| 918 // Message filter operations |
| 919 BOOL AddMessageFilter(CMessageFilter* pMessageFilter) |
| 920 { |
| 921 return m_aMsgFilter.Add(pMessageFilter); |
| 922 } |
| 923 |
| 924 BOOL RemoveMessageFilter(CMessageFilter* pMessageFilter) |
| 925 { |
| 926 return m_aMsgFilter.Remove(pMessageFilter); |
| 927 } |
| 928 |
| 929 // Idle handler operations |
| 930 BOOL AddIdleHandler(CIdleHandler* pIdleHandler) |
| 931 { |
| 932 return m_aIdleHandler.Add(pIdleHandler); |
| 933 } |
| 934 |
| 935 BOOL RemoveIdleHandler(CIdleHandler* pIdleHandler) |
| 936 { |
| 937 return m_aIdleHandler.Remove(pIdleHandler); |
| 938 } |
| 939 |
| 940 #ifndef _ATL_NO_OLD_NAMES |
| 941 // for compatilibility with old names only |
| 942 BOOL AddUpdateUI(CIdleHandler* pIdleHandler) |
| 943 { |
| 944 ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIObject and AddUpdateUI are
deprecated. Please change your code to use CIdleHandler and OnIdle\n")); |
| 945 return AddIdleHandler(pIdleHandler); |
| 946 } |
| 947 |
| 948 BOOL RemoveUpdateUI(CIdleHandler* pIdleHandler) |
| 949 { |
| 950 ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIObject and RemoveUpdateUI
are deprecated. Please change your code to use CIdleHandler and OnIdle\n")); |
| 951 return RemoveIdleHandler(pIdleHandler); |
| 952 } |
| 953 #endif // !_ATL_NO_OLD_NAMES |
| 954 |
| 955 // message loop |
| 956 int Run() |
| 957 { |
| 958 BOOL bDoIdle = TRUE; |
| 959 int nIdleCount = 0; |
| 960 BOOL bRet; |
| 961 |
| 962 for(;;) |
| 963 { |
| 964 while(bDoIdle && !::PeekMessage(&m_msg, NULL, 0, 0, PM_N
OREMOVE)) |
| 965 { |
| 966 if(!OnIdle(nIdleCount++)) |
| 967 bDoIdle = FALSE; |
| 968 } |
| 969 |
| 970 bRet = ::GetMessage(&m_msg, NULL, 0, 0); |
| 971 |
| 972 if(bRet == -1) |
| 973 { |
| 974 ATLTRACE2(atlTraceUI, 0, _T("::GetMessage return
ed -1 (error)\n")); |
| 975 continue; // error, don't process |
| 976 } |
| 977 else if(!bRet) |
| 978 { |
| 979 ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run -
exiting\n")); |
| 980 break; // WM_QUIT, exit message loop |
| 981 } |
| 982 |
| 983 if(!PreTranslateMessage(&m_msg)) |
| 984 { |
| 985 ::TranslateMessage(&m_msg); |
| 986 ::DispatchMessage(&m_msg); |
| 987 } |
| 988 |
| 989 if(IsIdleMessage(&m_msg)) |
| 990 { |
| 991 bDoIdle = TRUE; |
| 992 nIdleCount = 0; |
| 993 } |
| 994 } |
| 995 |
| 996 return (int)m_msg.wParam; |
| 997 } |
| 998 |
| 999 static BOOL IsIdleMessage(MSG* pMsg) |
| 1000 { |
| 1001 // These messages should NOT cause idle processing |
| 1002 switch(pMsg->message) |
| 1003 { |
| 1004 case WM_MOUSEMOVE: |
| 1005 #ifndef _WIN32_WCE |
| 1006 case WM_NCMOUSEMOVE: |
| 1007 #endif // !_WIN32_WCE |
| 1008 case WM_PAINT: |
| 1009 case 0x0118: // WM_SYSTIMER (caret blink) |
| 1010 return FALSE; |
| 1011 } |
| 1012 |
| 1013 return TRUE; |
| 1014 } |
| 1015 |
| 1016 // Overrideables |
| 1017 // Override to change message filtering |
| 1018 virtual BOOL PreTranslateMessage(MSG* pMsg) |
| 1019 { |
| 1020 // loop backwards |
| 1021 for(int i = m_aMsgFilter.GetSize() - 1; i >= 0; i--) |
| 1022 { |
| 1023 CMessageFilter* pMessageFilter = m_aMsgFilter[i]; |
| 1024 if(pMessageFilter != NULL && pMessageFilter->PreTranslat
eMessage(pMsg)) |
| 1025 return TRUE; |
| 1026 } |
| 1027 return FALSE; // not translated |
| 1028 } |
| 1029 |
| 1030 // override to change idle processing |
| 1031 virtual BOOL OnIdle(int /*nIdleCount*/) |
| 1032 { |
| 1033 for(int i = 0; i < m_aIdleHandler.GetSize(); i++) |
| 1034 { |
| 1035 CIdleHandler* pIdleHandler = m_aIdleHandler[i]; |
| 1036 if(pIdleHandler != NULL) |
| 1037 pIdleHandler->OnIdle(); |
| 1038 } |
| 1039 return FALSE; // don't continue |
| 1040 } |
| 1041 }; |
| 1042 |
| 1043 |
| 1044 /////////////////////////////////////////////////////////////////////////////// |
| 1045 // CStaticDataInitCriticalSectionLock and CWindowCreateCriticalSectionLock |
| 1046 // internal classes to manage critical sections for both ATL3 and ATL7 |
| 1047 |
| 1048 class CStaticDataInitCriticalSectionLock |
| 1049 { |
| 1050 public: |
| 1051 #if (_ATL_VER >= 0x0700) |
| 1052 ATL::CComCritSecLock<ATL::CComCriticalSection> m_cslock; |
| 1053 |
| 1054 CStaticDataInitCriticalSectionLock() : m_cslock(ATL::_pAtlModule->m_csSt
aticDataInitAndTypeInfo, false) |
| 1055 { } |
| 1056 #endif // (_ATL_VER >= 0x0700) |
| 1057 |
| 1058 HRESULT Lock() |
| 1059 { |
| 1060 #if (_ATL_VER >= 0x0700) |
| 1061 return m_cslock.Lock(); |
| 1062 #else // !(_ATL_VER >= 0x0700) |
| 1063 ::EnterCriticalSection(&ATL::_pModule->m_csStaticDataInit); |
| 1064 return S_OK; |
| 1065 #endif // !(_ATL_VER >= 0x0700) |
| 1066 } |
| 1067 |
| 1068 void Unlock() |
| 1069 { |
| 1070 #if (_ATL_VER >= 0x0700) |
| 1071 m_cslock.Unlock(); |
| 1072 #else // !(_ATL_VER >= 0x0700) |
| 1073 ::LeaveCriticalSection(&ATL::_pModule->m_csStaticDataInit); |
| 1074 #endif // !(_ATL_VER >= 0x0700) |
| 1075 } |
| 1076 }; |
| 1077 |
| 1078 |
| 1079 class CWindowCreateCriticalSectionLock |
| 1080 { |
| 1081 public: |
| 1082 #if (_ATL_VER >= 0x0700) |
| 1083 ATL::CComCritSecLock<ATL::CComCriticalSection> m_cslock; |
| 1084 |
| 1085 CWindowCreateCriticalSectionLock() : m_cslock(ATL::_AtlWinModule.m_csWin
dowCreate, false) |
| 1086 { } |
| 1087 #endif // (_ATL_VER >= 0x0700) |
| 1088 |
| 1089 HRESULT Lock() |
| 1090 { |
| 1091 #if (_ATL_VER >= 0x0700) |
| 1092 return m_cslock.Lock(); |
| 1093 #else // !(_ATL_VER >= 0x0700) |
| 1094 ::EnterCriticalSection(&ATL::_pModule->m_csWindowCreate); |
| 1095 return S_OK; |
| 1096 #endif // !(_ATL_VER >= 0x0700) |
| 1097 } |
| 1098 |
| 1099 void Unlock() |
| 1100 { |
| 1101 #if (_ATL_VER >= 0x0700) |
| 1102 m_cslock.Unlock(); |
| 1103 #else // !(_ATL_VER >= 0x0700) |
| 1104 ::LeaveCriticalSection(&ATL::_pModule->m_csWindowCreate); |
| 1105 #endif // !(_ATL_VER >= 0x0700) |
| 1106 } |
| 1107 }; |
| 1108 |
| 1109 |
| 1110 /////////////////////////////////////////////////////////////////////////////// |
| 1111 // CTempBuffer - helper class for stack allocations for ATL3 |
| 1112 |
| 1113 #ifndef _WTL_STACK_ALLOC_THRESHOLD |
| 1114 #define _WTL_STACK_ALLOC_THRESHOLD 512 |
| 1115 #endif |
| 1116 |
| 1117 #if (_ATL_VER >= 0x0700) |
| 1118 |
| 1119 using ATL::CTempBuffer; |
| 1120 |
| 1121 #else // !(_ATL_VER >= 0x0700) |
| 1122 |
| 1123 #ifndef SIZE_MAX |
| 1124 #ifdef _WIN64 |
| 1125 #define SIZE_MAX _UI64_MAX |
| 1126 #else |
| 1127 #define SIZE_MAX UINT_MAX |
| 1128 #endif |
| 1129 #endif |
| 1130 |
| 1131 #pragma warning(disable: 4284) // warning for operator -> |
| 1132 |
| 1133 template<typename T, int t_nFixedBytes = 128> |
| 1134 class CTempBuffer |
| 1135 { |
| 1136 public: |
| 1137 CTempBuffer() : m_p(NULL) |
| 1138 { |
| 1139 } |
| 1140 |
| 1141 CTempBuffer(size_t nElements) : m_p(NULL) |
| 1142 { |
| 1143 Allocate(nElements); |
| 1144 } |
| 1145 |
| 1146 ~CTempBuffer() |
| 1147 { |
| 1148 if(m_p != reinterpret_cast<T*>(m_abFixedBuffer)) |
| 1149 free(m_p); |
| 1150 } |
| 1151 |
| 1152 operator T*() const |
| 1153 { |
| 1154 return m_p; |
| 1155 } |
| 1156 |
| 1157 T* operator ->() const |
| 1158 { |
| 1159 ATLASSERT(m_p != NULL); |
| 1160 return m_p; |
| 1161 } |
| 1162 |
| 1163 T* Allocate(size_t nElements) |
| 1164 { |
| 1165 ATLASSERT(nElements <= (SIZE_MAX / sizeof(T))); |
| 1166 return AllocateBytes(nElements * sizeof(T)); |
| 1167 } |
| 1168 |
| 1169 T* AllocateBytes(size_t nBytes) |
| 1170 { |
| 1171 ATLASSERT(m_p == NULL); |
| 1172 if(nBytes > t_nFixedBytes) |
| 1173 m_p = static_cast<T*>(malloc(nBytes)); |
| 1174 else |
| 1175 m_p = reinterpret_cast<T*>(m_abFixedBuffer); |
| 1176 |
| 1177 return m_p; |
| 1178 } |
| 1179 |
| 1180 private: |
| 1181 T* m_p; |
| 1182 BYTE m_abFixedBuffer[t_nFixedBytes]; |
| 1183 }; |
| 1184 |
| 1185 #pragma warning(default: 4284) |
| 1186 |
| 1187 #endif // !(_ATL_VER >= 0x0700) |
| 1188 |
| 1189 |
| 1190 /////////////////////////////////////////////////////////////////////////////// |
| 1191 // CAppModule - module class for an application |
| 1192 |
| 1193 class CAppModule : public ATL::CComModule |
| 1194 { |
| 1195 public: |
| 1196 DWORD m_dwMainThreadID; |
| 1197 ATL::CSimpleMap<DWORD, CMessageLoop*>* m_pMsgLoopMap; |
| 1198 ATL::CSimpleArray<HWND>* m_pSettingChangeNotify; |
| 1199 |
| 1200 // Overrides of CComModule::Init and Term |
| 1201 HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const
GUID* pLibID = NULL) |
| 1202 { |
| 1203 HRESULT hRet = CComModule::Init(pObjMap, hInstance, pLibID); |
| 1204 if(FAILED(hRet)) |
| 1205 return hRet; |
| 1206 |
| 1207 m_dwMainThreadID = ::GetCurrentThreadId(); |
| 1208 typedef ATL::CSimpleMap<DWORD, CMessageLoop*> _mapClass; |
| 1209 m_pMsgLoopMap = NULL; |
| 1210 ATLTRY(m_pMsgLoopMap = new _mapClass); |
| 1211 if(m_pMsgLoopMap == NULL) |
| 1212 return E_OUTOFMEMORY; |
| 1213 m_pSettingChangeNotify = NULL; |
| 1214 |
| 1215 return hRet; |
| 1216 } |
| 1217 |
| 1218 void Term() |
| 1219 { |
| 1220 TermSettingChangeNotify(); |
| 1221 delete m_pMsgLoopMap; |
| 1222 CComModule::Term(); |
| 1223 } |
| 1224 |
| 1225 // Message loop map methods |
| 1226 BOOL AddMessageLoop(CMessageLoop* pMsgLoop) |
| 1227 { |
| 1228 CStaticDataInitCriticalSectionLock lock; |
| 1229 if(FAILED(lock.Lock())) |
| 1230 { |
| 1231 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock crit
ical section in CAppModule::AddMessageLoop.\n")); |
| 1232 ATLASSERT(FALSE); |
| 1233 return FALSE; |
| 1234 } |
| 1235 |
| 1236 ATLASSERT(pMsgLoop != NULL); |
| 1237 ATLASSERT(m_pMsgLoopMap->Lookup(::GetCurrentThreadId()) == NULL)
; // not in map yet |
| 1238 |
| 1239 BOOL bRet = m_pMsgLoopMap->Add(::GetCurrentThreadId(), pMsgLoop)
; |
| 1240 |
| 1241 lock.Unlock(); |
| 1242 |
| 1243 return bRet; |
| 1244 } |
| 1245 |
| 1246 BOOL RemoveMessageLoop() |
| 1247 { |
| 1248 CStaticDataInitCriticalSectionLock lock; |
| 1249 if(FAILED(lock.Lock())) |
| 1250 { |
| 1251 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock crit
ical section in CAppModule::RemoveMessageLoop.\n")); |
| 1252 ATLASSERT(FALSE); |
| 1253 return FALSE; |
| 1254 } |
| 1255 |
| 1256 BOOL bRet = m_pMsgLoopMap->Remove(::GetCurrentThreadId()); |
| 1257 |
| 1258 lock.Unlock(); |
| 1259 |
| 1260 return bRet; |
| 1261 } |
| 1262 |
| 1263 CMessageLoop* GetMessageLoop(DWORD dwThreadID = ::GetCurrentThreadId())
const |
| 1264 { |
| 1265 CStaticDataInitCriticalSectionLock lock; |
| 1266 if(FAILED(lock.Lock())) |
| 1267 { |
| 1268 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock crit
ical section in CAppModule::GetMessageLoop.\n")); |
| 1269 ATLASSERT(FALSE); |
| 1270 return NULL; |
| 1271 } |
| 1272 |
| 1273 CMessageLoop* pLoop = m_pMsgLoopMap->Lookup(dwThreadID); |
| 1274 |
| 1275 lock.Unlock(); |
| 1276 |
| 1277 return pLoop; |
| 1278 } |
| 1279 |
| 1280 // Setting change notify methods |
| 1281 // Note: Call this from the main thread for MSDI apps |
| 1282 BOOL InitSettingChangeNotify(DLGPROC pfnDlgProc = _SettingChangeDlgProc) |
| 1283 { |
| 1284 CStaticDataInitCriticalSectionLock lock; |
| 1285 if(FAILED(lock.Lock())) |
| 1286 { |
| 1287 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock crit
ical section in CAppModule::InitSettingChangeNotify.\n")); |
| 1288 ATLASSERT(FALSE); |
| 1289 return FALSE; |
| 1290 } |
| 1291 |
| 1292 if(m_pSettingChangeNotify == NULL) |
| 1293 { |
| 1294 typedef ATL::CSimpleArray<HWND> _notifyClass; |
| 1295 ATLTRY(m_pSettingChangeNotify = new _notifyClass); |
| 1296 ATLASSERT(m_pSettingChangeNotify != NULL); |
| 1297 } |
| 1298 |
| 1299 BOOL bRet = (m_pSettingChangeNotify != NULL); |
| 1300 if(bRet && m_pSettingChangeNotify->GetSize() == 0) |
| 1301 { |
| 1302 // init everything |
| 1303 _ATL_EMPTY_DLGTEMPLATE templ; |
| 1304 HWND hNtfWnd = ::CreateDialogIndirect(GetModuleInstance(
), &templ, NULL, pfnDlgProc); |
| 1305 ATLASSERT(::IsWindow(hNtfWnd)); |
| 1306 if(::IsWindow(hNtfWnd)) |
| 1307 { |
| 1308 // need conditional code because types don't match in winuser.h |
| 1309 #ifdef _WIN64 |
| 1310 ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, (LONG
_PTR)this); |
| 1311 #else |
| 1312 ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, PtrTo
Long(this)); |
| 1313 #endif |
| 1314 bRet = m_pSettingChangeNotify->Add(hNtfWnd); |
| 1315 } |
| 1316 else |
| 1317 { |
| 1318 bRet = FALSE; |
| 1319 } |
| 1320 } |
| 1321 |
| 1322 lock.Unlock(); |
| 1323 |
| 1324 return bRet; |
| 1325 } |
| 1326 |
| 1327 void TermSettingChangeNotify() |
| 1328 { |
| 1329 CStaticDataInitCriticalSectionLock lock; |
| 1330 if(FAILED(lock.Lock())) |
| 1331 { |
| 1332 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock crit
ical section in CAppModule::TermSettingChangeNotify.\n")); |
| 1333 ATLASSERT(FALSE); |
| 1334 return; |
| 1335 } |
| 1336 |
| 1337 if(m_pSettingChangeNotify != NULL && m_pSettingChangeNotify->Get
Size() > 0) |
| 1338 ::DestroyWindow((*m_pSettingChangeNotify)[0]); |
| 1339 delete m_pSettingChangeNotify; |
| 1340 m_pSettingChangeNotify = NULL; |
| 1341 |
| 1342 lock.Unlock(); |
| 1343 } |
| 1344 |
| 1345 BOOL AddSettingChangeNotify(HWND hWnd) |
| 1346 { |
| 1347 CStaticDataInitCriticalSectionLock lock; |
| 1348 if(FAILED(lock.Lock())) |
| 1349 { |
| 1350 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock crit
ical section in CAppModule::AddSettingChangeNotify.\n")); |
| 1351 ATLASSERT(FALSE); |
| 1352 return FALSE; |
| 1353 } |
| 1354 |
| 1355 ATLASSERT(::IsWindow(hWnd)); |
| 1356 BOOL bRet = FALSE; |
| 1357 if(InitSettingChangeNotify() != FALSE) |
| 1358 bRet = m_pSettingChangeNotify->Add(hWnd); |
| 1359 |
| 1360 lock.Unlock(); |
| 1361 |
| 1362 return bRet; |
| 1363 } |
| 1364 |
| 1365 BOOL RemoveSettingChangeNotify(HWND hWnd) |
| 1366 { |
| 1367 CStaticDataInitCriticalSectionLock lock; |
| 1368 if(FAILED(lock.Lock())) |
| 1369 { |
| 1370 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock crit
ical section in CAppModule::RemoveSettingChangeNotify.\n")); |
| 1371 ATLASSERT(FALSE); |
| 1372 return FALSE; |
| 1373 } |
| 1374 |
| 1375 BOOL bRet = FALSE; |
| 1376 if(m_pSettingChangeNotify != NULL) |
| 1377 bRet = m_pSettingChangeNotify->Remove(hWnd); |
| 1378 |
| 1379 lock.Unlock(); |
| 1380 |
| 1381 return bRet; |
| 1382 } |
| 1383 |
| 1384 // Implementation - setting change notify dialog template and dialog procedure |
| 1385 struct _ATL_EMPTY_DLGTEMPLATE : DLGTEMPLATE |
| 1386 { |
| 1387 _ATL_EMPTY_DLGTEMPLATE() |
| 1388 { |
| 1389 memset(this, 0, sizeof(_ATL_EMPTY_DLGTEMPLATE)); |
| 1390 style = WS_POPUP; |
| 1391 } |
| 1392 WORD wMenu, wClass, wTitle; |
| 1393 }; |
| 1394 |
| 1395 #ifdef _WIN64 |
| 1396 static INT_PTR CALLBACK _SettingChangeDlgProc(HWND hWnd, UINT uMsg, WPAR
AM wParam, LPARAM lParam) |
| 1397 #else |
| 1398 static BOOL CALLBACK _SettingChangeDlgProc(HWND hWnd, UINT uMsg, WPARAM
wParam, LPARAM lParam) |
| 1399 #endif |
| 1400 { |
| 1401 if(uMsg == WM_SETTINGCHANGE) |
| 1402 { |
| 1403 // need conditional code because types don't match in winuser.h |
| 1404 #ifdef _WIN64 |
| 1405 CAppModule* pModule = (CAppModule*)::GetWindowLongPtr(hW
nd, GWLP_USERDATA); |
| 1406 #else |
| 1407 CAppModule* pModule = (CAppModule*)LongToPtr(::GetWindow
LongPtr(hWnd, GWLP_USERDATA)); |
| 1408 #endif |
| 1409 ATLASSERT(pModule != NULL); |
| 1410 ATLASSERT(pModule->m_pSettingChangeNotify != NULL); |
| 1411 const UINT uTimeout = 1500; // ms |
| 1412 for(int i = 1; i < pModule->m_pSettingChangeNotify->GetS
ize(); i++) |
| 1413 { |
| 1414 #if !defined(_WIN32_WCE) |
| 1415 ::SendMessageTimeout((*pModule->m_pSettingChange
Notify)[i], uMsg, wParam, lParam, SMTO_ABORTIFHUNG, uTimeout, NULL); |
| 1416 #elif(_WIN32_WCE >= 400) // CE specific |
| 1417 ::SendMessageTimeout((*pModule->m_pSettingChange
Notify)[i], uMsg, wParam, lParam, SMTO_NORMAL, uTimeout, NULL); |
| 1418 #else // _WIN32_WCE < 400 specific |
| 1419 uTimeout; |
| 1420 ::SendMessage((*pModule->m_pSettingChangeNotify)
[i], uMsg, wParam, lParam); |
| 1421 #endif |
| 1422 } |
| 1423 return TRUE; |
| 1424 } |
| 1425 return FALSE; |
| 1426 } |
| 1427 }; |
| 1428 |
| 1429 |
| 1430 /////////////////////////////////////////////////////////////////////////////// |
| 1431 // CServerAppModule - module class for a COM server application |
| 1432 |
| 1433 class CServerAppModule : public CAppModule |
| 1434 { |
| 1435 public: |
| 1436 HANDLE m_hEventShutdown; |
| 1437 bool m_bActivity; |
| 1438 DWORD m_dwTimeOut; |
| 1439 DWORD m_dwPause; |
| 1440 |
| 1441 // Override of CAppModule::Init |
| 1442 HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const
GUID* pLibID = NULL) |
| 1443 { |
| 1444 m_dwTimeOut = 5000; |
| 1445 m_dwPause = 1000; |
| 1446 return CAppModule::Init(pObjMap, hInstance, pLibID); |
| 1447 } |
| 1448 |
| 1449 void Term() |
| 1450 { |
| 1451 if(m_hEventShutdown != NULL && ::CloseHandle(m_hEventShutdown)) |
| 1452 m_hEventShutdown = NULL; |
| 1453 CAppModule::Term(); |
| 1454 } |
| 1455 |
| 1456 // COM Server methods |
| 1457 LONG Unlock() |
| 1458 { |
| 1459 LONG lRet = CComModule::Unlock(); |
| 1460 if(lRet == 0) |
| 1461 { |
| 1462 m_bActivity = true; |
| 1463 ::SetEvent(m_hEventShutdown); // tell monitor that we tr
ansitioned to zero |
| 1464 } |
| 1465 return lRet; |
| 1466 } |
| 1467 |
| 1468 void MonitorShutdown() |
| 1469 { |
| 1470 for(;;) |
| 1471 { |
| 1472 ::WaitForSingleObject(m_hEventShutdown, INFINITE); |
| 1473 DWORD dwWait = 0; |
| 1474 do |
| 1475 { |
| 1476 m_bActivity = false; |
| 1477 dwWait = ::WaitForSingleObject(m_hEventShutdown,
m_dwTimeOut); |
| 1478 } |
| 1479 while(dwWait == WAIT_OBJECT_0); |
| 1480 // timed out |
| 1481 if(!m_bActivity && m_nLockCnt == 0) // if no activity le
t's really bail |
| 1482 { |
| 1483 #if ((_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM)) && defined(_ATL_FREE_THR
EADED) && !defined(_WIN32_WCE) |
| 1484 ::CoSuspendClassObjects(); |
| 1485 if(!m_bActivity && m_nLockCnt == 0) |
| 1486 #endif |
| 1487 break; |
| 1488 } |
| 1489 } |
| 1490 // This handle should be valid now. If it isn't, |
| 1491 // check if _Module.Term was called first (it shouldn't) |
| 1492 if(::CloseHandle(m_hEventShutdown)) |
| 1493 m_hEventShutdown = NULL; |
| 1494 ::PostThreadMessage(m_dwMainThreadID, WM_QUIT, 0, 0); |
| 1495 } |
| 1496 |
| 1497 bool StartMonitor() |
| 1498 { |
| 1499 m_hEventShutdown = ::CreateEvent(NULL, false, false, NULL); |
| 1500 if(m_hEventShutdown == NULL) |
| 1501 return false; |
| 1502 DWORD dwThreadID = 0; |
| 1503 #if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE) |
| 1504 HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, (UINT (WINAPI*)
(void*))MonitorProc, this, 0, (UINT*)&dwThreadID); |
| 1505 #else |
| 1506 HANDLE hThread = ::CreateThread(NULL, 0, MonitorProc, this, 0, &
dwThreadID); |
| 1507 #endif |
| 1508 bool bRet = (hThread != NULL); |
| 1509 if(bRet) |
| 1510 ::CloseHandle(hThread); |
| 1511 return bRet; |
| 1512 } |
| 1513 |
| 1514 static DWORD WINAPI MonitorProc(void* pv) |
| 1515 { |
| 1516 CServerAppModule* p = (CServerAppModule*)pv; |
| 1517 p->MonitorShutdown(); |
| 1518 return 0; |
| 1519 } |
| 1520 |
| 1521 #if (_ATL_VER < 0x0700) |
| 1522 // search for an occurence of string p2 in string p1 |
| 1523 static LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) |
| 1524 { |
| 1525 while(p1 != NULL && *p1 != NULL) |
| 1526 { |
| 1527 LPCTSTR p = p2; |
| 1528 while(p != NULL && *p != NULL) |
| 1529 { |
| 1530 if(*p1 == *p) |
| 1531 return ::CharNext(p1); |
| 1532 p = ::CharNext(p); |
| 1533 } |
| 1534 p1 = ::CharNext(p1); |
| 1535 } |
| 1536 return NULL; |
| 1537 } |
| 1538 #endif // (_ATL_VER < 0x0700) |
| 1539 }; |
| 1540 |
| 1541 |
| 1542 /////////////////////////////////////////////////////////////////////////////// |
| 1543 // CString forward reference (enables CString use in atluser.h and atlgdi.h) |
| 1544 |
| 1545 #if defined(_WTL_FORWARD_DECLARE_CSTRING) && !defined(_WTL_USE_CSTRING) |
| 1546 #define _WTL_USE_CSTRING |
| 1547 #endif // defined(_WTL_FORWARD_DECLARE_CSTRING) && !defined(_WTL_USE_CSTRING) |
| 1548 |
| 1549 #ifdef _WTL_USE_CSTRING |
| 1550 class CString; // forward declaration (include atlmisc.h for the whole class
) |
| 1551 #endif // _WTL_USE_CSTRING |
| 1552 |
| 1553 // CString namespace |
| 1554 #ifndef _CSTRING_NS |
| 1555 #ifdef __ATLSTR_H__ |
| 1556 #define _CSTRING_NS ATL |
| 1557 #else |
| 1558 #define _CSTRING_NS WTL |
| 1559 #endif |
| 1560 #endif // _CSTRING_NS |
| 1561 |
| 1562 // Type classes namespace |
| 1563 #ifndef _WTYPES_NS |
| 1564 #ifdef __ATLTYPES_H__ |
| 1565 #define _WTYPES_NS |
| 1566 #else |
| 1567 #define _WTYPES_NS WTL |
| 1568 #endif |
| 1569 #endif // _WTYPES_NS |
| 1570 |
| 1571 }; // namespace WTL |
| 1572 |
| 1573 |
| 1574 /////////////////////////////////////////////////////////////////////////////// |
| 1575 // General DLL version helpers |
| 1576 // (ATL3: excluded from atlbase.h if _ATL_DLL is defined; ATL11: removed) |
| 1577 |
| 1578 #if (((_ATL_VER < 0x0700) && defined(_ATL_DLL)) || (_ATL_VER >= 0x0B00)) && !def
ined(_WIN32_WCE) |
| 1579 |
| 1580 namespace ATL |
| 1581 { |
| 1582 |
| 1583 inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionI
nfo) |
| 1584 { |
| 1585 ATLASSERT(pDllVersionInfo != NULL); |
| 1586 if(pDllVersionInfo == NULL) |
| 1587 return E_INVALIDARG; |
| 1588 |
| 1589 // We must get this function explicitly because some DLLs don't implemen
t it. |
| 1590 DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress
(hInstDLL, "DllGetVersion"); |
| 1591 if(pfnDllGetVersion == NULL) |
| 1592 return E_NOTIMPL; |
| 1593 |
| 1594 return (*pfnDllGetVersion)(pDllVersionInfo); |
| 1595 } |
| 1596 |
| 1597 inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersio
nInfo) |
| 1598 { |
| 1599 HINSTANCE hInstDLL = ::LoadLibrary(lpstrDllName); |
| 1600 if(hInstDLL == NULL) |
| 1601 return E_FAIL; |
| 1602 HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo); |
| 1603 ::FreeLibrary(hInstDLL); |
| 1604 return hRet; |
| 1605 } |
| 1606 |
| 1607 // Common Control Versions: |
| 1608 // Win95/WinNT 4.0 maj=4 min=00 |
| 1609 // IE 3.x maj=4 min=70 |
| 1610 // IE 4.0 maj=4 min=71 |
| 1611 inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) |
| 1612 { |
| 1613 ATLASSERT(pdwMajor != NULL && pdwMinor != NULL); |
| 1614 if(pdwMajor == NULL || pdwMinor == NULL) |
| 1615 return E_INVALIDARG; |
| 1616 |
| 1617 DLLVERSIONINFO dvi; |
| 1618 ::ZeroMemory(&dvi, sizeof(dvi)); |
| 1619 dvi.cbSize = sizeof(dvi); |
| 1620 HRESULT hRet = AtlGetDllVersion(_T("comctl32.dll"), &dvi); |
| 1621 |
| 1622 if(SUCCEEDED(hRet)) |
| 1623 { |
| 1624 *pdwMajor = dvi.dwMajorVersion; |
| 1625 *pdwMinor = dvi.dwMinorVersion; |
| 1626 } |
| 1627 else if(hRet == E_NOTIMPL) |
| 1628 { |
| 1629 // If DllGetVersion is not there, then the DLL is a version |
| 1630 // previous to the one shipped with IE 3.x |
| 1631 *pdwMajor = 4; |
| 1632 *pdwMinor = 0; |
| 1633 hRet = S_OK; |
| 1634 } |
| 1635 |
| 1636 return hRet; |
| 1637 } |
| 1638 |
| 1639 // Shell Versions: |
| 1640 // Win95/WinNT 4.0 maj=4 min=00 |
| 1641 // IE 3.x, IE 4.0 without Web Integrated Desktop maj=4 min=00 |
| 1642 // IE 4.0 with Web Integrated Desktop maj=4 min=71 |
| 1643 // IE 4.01 with Web Integrated Desktop maj=4 min=72 |
| 1644 inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) |
| 1645 { |
| 1646 ATLASSERT(pdwMajor != NULL && pdwMinor != NULL); |
| 1647 if(pdwMajor == NULL || pdwMinor == NULL) |
| 1648 return E_INVALIDARG; |
| 1649 |
| 1650 DLLVERSIONINFO dvi; |
| 1651 ::ZeroMemory(&dvi, sizeof(dvi)); |
| 1652 dvi.cbSize = sizeof(dvi); |
| 1653 HRESULT hRet = AtlGetDllVersion(_T("shell32.dll"), &dvi); |
| 1654 |
| 1655 if(SUCCEEDED(hRet)) |
| 1656 { |
| 1657 *pdwMajor = dvi.dwMajorVersion; |
| 1658 *pdwMinor = dvi.dwMinorVersion; |
| 1659 } |
| 1660 else if(hRet == E_NOTIMPL) |
| 1661 { |
| 1662 // If DllGetVersion is not there, then the DLL is a version |
| 1663 // previous to the one shipped with IE 4.x |
| 1664 *pdwMajor = 4; |
| 1665 *pdwMinor = 0; |
| 1666 hRet = S_OK; |
| 1667 } |
| 1668 |
| 1669 return hRet; |
| 1670 } |
| 1671 |
| 1672 }; // namespace ATL |
| 1673 |
| 1674 #endif // (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE) |
| 1675 |
| 1676 |
| 1677 // These are always included |
| 1678 #include "atlwinx.h" |
| 1679 #include "atluser.h" |
| 1680 #include "atlgdi.h" |
| 1681 |
| 1682 #ifndef _WTL_NO_AUTOMATIC_NAMESPACE |
| 1683 using namespace WTL; |
| 1684 #endif // !_WTL_NO_AUTOMATIC_NAMESPACE |
| 1685 |
| 1686 #endif // __ATLAPP_H__ |
OLD | NEW |