annotate foosdk/wtl/Include/atlapp.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 // Windows Template Library - WTL version 10.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 // Copyright (C) Microsoft Corporation, WTL Team. All rights reserved.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 // This file is a part of the Windows Template Library.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 // The use and distribution terms for this software are covered by the
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // Microsoft Public License (http://opensource.org/licenses/MS-PL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 // which can be found in the file MS-PL.txt at the root folder.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #ifndef __ATLAPP_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define __ATLAPP_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #ifndef __cplusplus
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #error WTL requires C++ compilation (use a .cpp suffix)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #ifndef __ATLBASE_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #error atlapp.h requires atlbase.h to be included first
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 #ifdef _WIN32_WCE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 #error WTL10 doesn't support Windows CE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 #ifdef _ATL_NO_COMMODULE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 #error WTL requires that _ATL_NO_COMMODULE is not defined
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 #ifdef _ATL_NO_WIN_SUPPORT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 #error WTL requires that _ATL_NO_WIN_SUPPORT is not defined
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 #if (_MSC_VER < 1400)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 #error WTL10 requires C++ compiler version 14 (Visual C++ 2005) or higher
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 #if (WINVER < 0x0501)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 #error WTL requires WINVER >= 0x0501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 #if (_WIN32_WINNT < 0x0501)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 #error WTL requires _WIN32_WINNT >= 0x0501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 #if (_WIN32_IE < 0x0600)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 #error WTL requires _WIN32_IE >= 0x0600
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 #if (_ATL_VER < 0x0800)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 #error WTL10 requires ATL version 8 or higher
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 #ifdef _ATL_MIN_CRT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 #error WTL10 doesn't support _ATL_MIN_CRT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 #ifdef _ATL_NO_MSIMG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 #error WTL10 doesn't support _ATL_NO_MSIMG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 #include <limits.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 #ifdef _MT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 #include <process.h> // for _beginthreadex
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 #include <commctrl.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 #pragma comment(lib, "comctl32.lib")
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 #include <commdlg.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 #include <shellapi.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 // Check for VS2005 without newer WinSDK
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 #if (_MSC_VER == 1400) && !defined(RB_GETEXTENDEDSTYLE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 #error WTL10 requires WinSDK 6.0 ot higher
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 #include <uxtheme.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 #pragma comment(lib, "uxtheme.lib")
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 #if defined(_SYSINFOAPI_H_) && defined(NOT_BUILD_WINDOWS_DEPRECATE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 #include <VersionHelpers.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 #include "atlres.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 // WTL version number
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 #define _WTL_VER 0x1000 // version 10.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 // Classes in this file:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 // CMessageFilter
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 // CIdleHandler
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 // CMessageLoop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 // CAppModule
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 // CServerAppModule
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 // Global functions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 // AtlInitCommonControls()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 // AtlGetDefaultGuiFont()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 // AtlCreateControlFont()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 // AtlCreateBoldFont()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 // AtlGetStringPtr()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 // Miscellaneous global support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 // define useful macros from winuser.h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 #ifndef IS_INTRESOURCE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 #define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 #endif // IS_INTRESOURCE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 // protect template members from windowsx.h macros
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 #ifdef _INC_WINDOWSX
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 #undef SubclassWindow
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 #endif // _INC_WINDOWSX
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 // define useful macros from windowsx.h
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 #ifndef GET_X_LPARAM
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 #define GET_X_LPARAM(lParam) ((int)(short)LOWORD(lParam))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 #ifndef GET_Y_LPARAM
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 #define GET_Y_LPARAM(lParam) ((int)(short)HIWORD(lParam))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 // Dummy structs for compiling with /CLR
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 #ifdef _MANAGED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 __if_not_exists(_IMAGELIST::_IMAGELIST) { struct _IMAGELIST { }; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 __if_not_exists(_TREEITEM::_TREEITEM) { struct _TREEITEM { }; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 __if_not_exists(_PSP::_PSP) { struct _PSP { }; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 // Forward declaration for ATL11 fix
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 #if (_ATL_VER >= 0x0B00)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 namespace ATL { HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 #ifndef WM_MOUSEHWHEEL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 #define WM_MOUSEHWHEEL 0x020E
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 // Used for stack allocations with ATL::CTempBuffer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 #ifndef _WTL_STACK_ALLOC_THRESHOLD
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 #define _WTL_STACK_ALLOC_THRESHOLD 512
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 DECLARE_TRACE_CATEGORY(atlTraceUI)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 __declspec(selectany) ATL::CTraceCategory atlTraceUI(_T("atlTraceUI"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 #endif // _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 // Common Controls initialization helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 inline BOOL AtlInitCommonControls(DWORD dwFlags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 INITCOMMONCONTROLSEX iccx = { sizeof(INITCOMMONCONTROLSEX), dwFlags };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 BOOL bRet = ::InitCommonControlsEx(&iccx);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 // Default GUI font helper - "MS Shell Dlg" stock font
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 inline HFONT AtlGetDefaultGuiFont()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 return (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 // Control font helper - default font for controls not in a dialog
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 // (NOTE: Caller owns the font, and should destroy it when it's no longer needed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 inline HFONT AtlCreateControlFont()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 LOGFONT lf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 ATLVERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 HFONT hFont = ::CreateFontIndirect(&lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 ATLASSERT(hFont != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 return hFont;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 // Bold font helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 // (NOTE: Caller owns the font, and should destroy it when it's no longer needed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 inline HFONT AtlCreateBoldFont(HFONT hFont = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 LOGFONT lf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 if(hFont == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 ATLVERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0) != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 ATLVERIFY(::GetObject(hFont, sizeof(LOGFONT), &lf) == sizeof(LOGFONT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 lf.lfWeight = FW_BOLD;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 HFONT hFontBold = ::CreateFontIndirect(&lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 ATLASSERT(hFontBold != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 return hFontBold;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 // Resource string pointer
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 inline LPCWSTR AtlGetStringPtr(UINT uID, int* pch = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 LPCWSTR lpstr = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 int nRet = ::LoadStringW(ATL::_AtlBaseModule.GetResourceInstance(), uID, (LPWSTR)&lpstr, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 if(pch != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 *pch = nRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 return lpstr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 // RunTimeHelper - helper functions for Windows version and structure sizes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 #ifndef _WTL_NO_RUNTIME_STRUCT_SIZE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 #ifndef _SIZEOF_STRUCT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 #define _SIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 #if (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 #define REBARBANDINFO_V6_SIZE _SIZEOF_STRUCT(REBARBANDINFO, cxHeader)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 #endif // (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 #if (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 #define LVGROUP_V5_SIZE _SIZEOF_STRUCT(LVGROUP, uAlign)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 #endif // (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 #if (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 #define LVTILEINFO_V5_SIZE _SIZEOF_STRUCT(LVTILEINFO, puColumns)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 #endif // (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 #if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !defined(MCHITTESTINFO_V1_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 #define MCHITTESTINFO_V1_SIZE _SIZEOF_STRUCT(MCHITTESTINFO, st)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 #endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !defined(MCHITTESTINFO_V1_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 #if (WINVER >= 0x0600) && !defined(NONCLIENTMETRICS_V1_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 #define NONCLIENTMETRICS_V1_SIZE _SIZEOF_STRUCT(NONCLIENTMETRICS, lfMessageFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 #endif // (WINVER >= 0x0600) && !defined(NONCLIENTMETRICS_V1_SIZE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 #ifndef TTTOOLINFO_V2_SIZE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 #define TTTOOLINFO_V2_SIZE _SIZEOF_STRUCT(TTTOOLINFO, lParam)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 #endif // !_WTL_NO_RUNTIME_STRUCT_SIZE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 namespace RunTimeHelper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 inline bool IsCommCtrl6()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 DWORD dwMajor = 0, dwMinor = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 return (SUCCEEDED(hRet) && (dwMajor >= 6));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 inline bool IsVista()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 #ifdef _versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 return ::IsWindowsVistaOrGreater();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 #else // !_versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 BOOL bRet = ::GetVersionEx(&ovi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 return ((bRet != FALSE) && (ovi.dwMajorVersion >= 6));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 #endif // _versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 inline bool IsThemeAvailable()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 return IsCommCtrl6() && (::IsThemeActive() != FALSE) && (::IsAppThemed() != FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 inline bool IsWin7()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 #ifdef _versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 return ::IsWindows7OrGreater();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 #else // !_versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280 OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 BOOL bRet = ::GetVersionEx(&ovi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 return ((bRet != FALSE) && ((ovi.dwMajorVersion > 6) || ((ovi.dwMajorVersion == 6) && (ovi.dwMinorVersion >= 1))));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 #endif // _versionhelpers_H_INCLUDED_
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286 inline bool IsRibbonUIAvailable()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288 static INT iRibbonUI = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 #if defined(NTDDI_WIN7) && (NTDDI_VERSION >= NTDDI_WIN7)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291 if (iRibbonUI == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 HMODULE hRibbonDLL = ::LoadLibrary(_T("propsys.dll"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 if (hRibbonDLL != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 const GUID CLSID_UIRibbonFramework = { 0x926749fa, 0x2615, 0x4987, { 0x88, 0x45, 0xc3, 0x3e, 0x65, 0xf2, 0xb9, 0x57 } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 // block - create instance
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 ATL::CComPtr<IUnknown> pIUIFramework;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 iRibbonUI = SUCCEEDED(pIUIFramework.CoCreateInstance(CLSID_UIRibbonFramework)) ? 1 : 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 ::FreeLibrary(hRibbonDLL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
303 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
304 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 iRibbonUI = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
307 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
308 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 #endif // defined(NTDDI_WIN7) && (NTDDI_VERSION >= NTDDI_WIN7)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
310
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
311 return (iRibbonUI == 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
312 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
313
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 inline UINT SizeOf_REBARBANDINFO()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 UINT uSize = sizeof(REBARBANDINFO);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 if(!(IsVista() && IsCommCtrl6()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 uSize = REBARBANDINFO_V6_SIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 return uSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324 inline UINT SizeOf_LVGROUP()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 UINT uSize = sizeof(LVGROUP);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 if(!IsVista())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 uSize = LVGROUP_V5_SIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 return uSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 inline UINT SizeOf_LVTILEINFO()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 UINT uSize = sizeof(LVTILEINFO);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 if(!IsVista())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339 uSize = LVTILEINFO_V5_SIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 return uSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
342 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
343
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 inline UINT SizeOf_MCHITTESTINFO()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 UINT uSize = sizeof(MCHITTESTINFO);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 if(!(IsVista() && IsCommCtrl6()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 uSize = MCHITTESTINFO_V1_SIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 return uSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
352 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
353
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
354 inline UINT SizeOf_NONCLIENTMETRICS()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 UINT uSize = sizeof(NONCLIENTMETRICS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 #if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 if(!IsVista())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 uSize = NONCLIENTMETRICS_V1_SIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360 #endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 return uSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 inline UINT SizeOf_TOOLINFO()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 UINT uSize = sizeof(TOOLINFO);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 #ifndef _WTL_NO_RUNTIME_STRUCT_SIZE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 if(!IsVista())
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 uSize = TTTOOLINFO_V2_SIZE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 return uSize;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
372 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
373 } // namespace RunTimeHelper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
374
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
375
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
376 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
377 // ModuleHelper - helper functions for ATL (deprecated)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
378
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
379 namespace ModuleHelper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 inline HINSTANCE GetModuleInstance()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
382 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
383 return ATL::_AtlBaseModule.GetModuleInstance();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 inline HINSTANCE GetResourceInstance()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 return ATL::_AtlBaseModule.GetResourceInstance();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
390
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
391 inline void AddCreateWndData(ATL::_AtlCreateWndData* pData, void* pObject)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
392 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
393 ATL::_AtlWinModule.AddCreateWndData(pData, pObject);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
394 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
395
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 inline void* ExtractCreateWndData()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 return ATL::_AtlWinModule.ExtractCreateWndData();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 } // namespace ModuleHelper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 // SecureHelper - WTL10 requires use of secure functions
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405 // these are here only for compatibility with existing projects
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 namespace SecureHelper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
408 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
409 inline void strcpyA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
410 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
411 ATL::Checked::strcpy_s(lpstrDest, cchDest, lpstrSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 inline void strcpyW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416 ATL::Checked::wcscpy_s(lpstrDest, cchDest, lpstrSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
418
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
419 inline void strcpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 #ifdef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 strcpyW_x(lpstrDest, cchDest, lpstrSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 strcpyA_x(lpstrDest, cchDest, lpstrSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
426 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
427
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 inline errno_t strncpyA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc, size_t cchCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 return ATL::Checked::strncpy_s(lpstrDest, cchDest, lpstrSrc, cchCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
431 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
432
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 inline errno_t strncpyW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc, size_t cchCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 return ATL::Checked::wcsncpy_s(lpstrDest, cchDest, lpstrSrc, cchCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
436 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
437
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 inline errno_t strncpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc, size_t cchCount)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 #ifdef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 return strncpyW_x(lpstrDest, cchDest, lpstrSrc, cchCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 return strncpyA_x(lpstrDest, cchDest, lpstrSrc, cchCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
446
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
447 inline void strcatA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
448 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
449 ATL::Checked::strcat_s(lpstrDest, cchDest, lpstrSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
450 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
451
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 inline void strcatW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 ATL::Checked::wcscat_s(lpstrDest, cchDest, lpstrSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
455 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
456
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
457 inline void strcat_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
458 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
459 #ifdef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460 strcatW_x(lpstrDest, cchDest, lpstrSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 strcatA_x(lpstrDest, cchDest, lpstrSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 inline void memcpy_x(void* pDest, size_t cbDest, const void* pSrc, size_t cbSrc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 ATL::Checked::memcpy_s(pDest, cbDest, pSrc, cbSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
470
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
471 inline void memmove_x(void* pDest, size_t cbDest, const void* pSrc, size_t cbSrc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 ATL::Checked::memmove_s(pDest, cbDest, pSrc, cbSrc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
474 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
475
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 inline int vsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, va_list args)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
479 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
480
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 inline int wvsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, va_list args)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
482 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
483 return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
484 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
485
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 inline int sprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, ...)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
487 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
488 va_list args;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 va_start(args, lpstrFormat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 int nRes = vsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 va_end(args);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 return nRes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
494
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
495 inline int wsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, ...)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 va_list args;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498 va_start(args, lpstrFormat);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 int nRes = wvsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 va_end(args);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 return nRes;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 } // namespace SecureHelper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
504
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
505
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507 // MinCrtHelper - WTL10 doesn't support _ATL_MIN_CRT,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 // these are here only for compatibility with existing projects
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
509
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
510 namespace MinCrtHelper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 inline int _isspace(TCHAR ch)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514 return _istspace(ch);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 inline int _isdigit(TCHAR ch)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519 return _istdigit(ch);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
521
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
522 inline int _atoi(LPCTSTR str)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524 return _ttoi(str);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
526
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
527 inline LPCTSTR _strrchr(LPCTSTR str, TCHAR ch)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
528 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
529 return _tcsrchr(str, ch);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
531
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
532 inline LPTSTR _strrchr(LPTSTR str, TCHAR ch)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534 return _tcsrchr(str, ch);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 } // namespace MinCrtHelper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
537
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
538
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
539 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
540 // GenericWndClass - generic window class usable for subclassing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
541
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
542 // Use in dialog templates to specify a placeholder to be subclassed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 // Specify as a custom control with class name WTL_GenericWindow
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 // Call Rregister() before creating dialog (for example, in WinMain)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545 namespace GenericWndClass
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 inline LPCTSTR GetName()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
548 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
549 return _T("WTL_GenericWindow");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 inline ATOM Register()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
553 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
554 WNDCLASSEX wc = { sizeof(WNDCLASSEX) };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555 wc.lpfnWndProc = ::DefWindowProc;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 wc.hInstance = ModuleHelper::GetModuleInstance();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 wc.lpszClassName = GetName();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 ATOM atom = ::RegisterClassEx(&wc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 ATLASSERT(atom != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562 return atom;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 inline BOOL Unregister() // only needed for DLLs or tmp use
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567 return ::UnregisterClass(GetName(), ModuleHelper::GetModuleInstance());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569 } // namespace GenericWndClass
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
571
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
572 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
573 // CMessageFilter - Interface for message filter support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
574
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
575 class CMessageFilter
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578 virtual BOOL PreTranslateMessage(MSG* pMsg) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
580
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
581
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
582 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
583 // CIdleHandler - Interface for idle processing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 class CIdleHandler
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
586 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
587 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588 virtual BOOL OnIdle() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
590
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
591
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 // CMessageLoop - message loop implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
594
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
595 class CMessageLoop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 ATL::CSimpleArray<CMessageFilter*> m_aMsgFilter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599 ATL::CSimpleArray<CIdleHandler*> m_aIdleHandler;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 MSG m_msg;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 CMessageLoop()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605 virtual ~CMessageLoop()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 // Message filter operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 BOOL AddMessageFilter(CMessageFilter* pMessageFilter)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
610 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
611 return m_aMsgFilter.Add(pMessageFilter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
613
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
614 BOOL RemoveMessageFilter(CMessageFilter* pMessageFilter)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
615 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
616 return m_aMsgFilter.Remove(pMessageFilter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619 // Idle handler operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 BOOL AddIdleHandler(CIdleHandler* pIdleHandler)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
621 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
622 return m_aIdleHandler.Add(pIdleHandler);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
624
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
625 BOOL RemoveIdleHandler(CIdleHandler* pIdleHandler)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
626 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
627 return m_aIdleHandler.Remove(pIdleHandler);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 // message loop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631 int Run()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 BOOL bDoIdle = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 int nIdleCount = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635 BOOL bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 for(;;)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
638 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
639 while(bDoIdle && !::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
640 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
641 if(!OnIdle(nIdleCount++))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 bDoIdle = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645 bRet = ::GetMessage(&m_msg, NULL, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 if(bRet == -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 ATLTRACE2(atlTraceUI, 0, _T("::GetMessage returned -1 (error)\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 continue; // error, don't process
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
651 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
652 else if(!bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
653 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
654 ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 break; // WM_QUIT, exit message loop
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
656 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
657
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 if(!PreTranslateMessage(&m_msg))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
659 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
660 ::TranslateMessage(&m_msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 ::DispatchMessage(&m_msg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 if(IsIdleMessage(&m_msg))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
665 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
666 bDoIdle = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 nIdleCount = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
668 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
669 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
670
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
671 return (int)m_msg.wParam;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
672 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
673
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 static BOOL IsIdleMessage(MSG* pMsg)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 // These messages should NOT cause idle processing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 switch(pMsg->message)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
678 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
679 case WM_MOUSEMOVE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 case WM_NCMOUSEMOVE:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681 case WM_PAINT:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 case 0x0118: // WM_SYSTIMER (caret blink)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
685
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
686 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
688
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
689 // Overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 // Override to change message filtering
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691 virtual BOOL PreTranslateMessage(MSG* pMsg)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 // loop backwards
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 for(int i = m_aMsgFilter.GetSize() - 1; i >= 0; i--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
695 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
696 CMessageFilter* pMessageFilter = m_aMsgFilter[i];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 if((pMessageFilter != NULL) && pMessageFilter->PreTranslateMessage(pMsg))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 return FALSE; // not translated
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
701 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
702
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 // override to change idle processing
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 virtual BOOL OnIdle(int /*nIdleCount*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
705 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
706 for(int i = 0; i < m_aIdleHandler.GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
707 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
708 CIdleHandler* pIdleHandler = m_aIdleHandler[i];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 if(pIdleHandler != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 pIdleHandler->OnIdle();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 return FALSE; // don't continue
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
713 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
714 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
715
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
716
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
717 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
718 // CStaticDataInitCriticalSectionLock and CWindowCreateCriticalSectionLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 // internal classes to manage critical sections for ATL (deprecated)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
720
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
721 class CStaticDataInitCriticalSectionLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
722 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
723 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 ATL::CComCritSecLock<ATL::CComCriticalSection> m_cslock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
725
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
726 CStaticDataInitCriticalSectionLock() : m_cslock(ATL::_pAtlModule->m_csStaticDataInitAndTypeInfo, false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
727 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
728
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
729 HRESULT Lock()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
730 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
731 return m_cslock.Lock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
732 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
733
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
734 void Unlock()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
735 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
736 m_cslock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
737 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
738 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
739
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
740
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
741 class CWindowCreateCriticalSectionLock
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
742 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
743 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 ATL::CComCritSecLock<ATL::CComCriticalSection> m_cslock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
745
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
746 CWindowCreateCriticalSectionLock() : m_cslock(ATL::_AtlWinModule.m_csWindowCreate, false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
747 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
748
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
749 HRESULT Lock()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 return m_cslock.Lock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
753
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
754 void Unlock()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756 m_cslock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
758 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
759
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 // CAppModule - module class for an application
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 #if (_MSC_VER == 1400) // VS2005
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 #pragma warning(push)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 #pragma warning(disable : 4244)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 #pragma warning(disable : 4312)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
769
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
770 class CAppModule : public ATL::CComModule
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
771 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
772 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 DWORD m_dwMainThreadID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774 ATL::CSimpleMap<DWORD, CMessageLoop*>* m_pMsgLoopMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 ATL::CSimpleArray<HWND>* m_pSettingChangeNotify;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777 // Overrides of CComModule::Init and Term
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const GUID* pLibID = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 HRESULT hRet = CComModule::Init(pObjMap, hInstance, pLibID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 if(FAILED(hRet))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782 return hRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
783
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
784 m_dwMainThreadID = ::GetCurrentThreadId();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785 typedef ATL::CSimpleMap<DWORD, CMessageLoop*> _mapClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786 m_pMsgLoopMap = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787 ATLTRY(m_pMsgLoopMap = new _mapClass);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 if(m_pMsgLoopMap == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 return E_OUTOFMEMORY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 m_pSettingChangeNotify = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 return hRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
793 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
794
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795 void Term()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 TermSettingChangeNotify();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 delete m_pMsgLoopMap;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 CComModule::Term();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
800 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
801
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
802 // Message loop map methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803 BOOL AddMessageLoop(CMessageLoop* pMsgLoop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddMessageLoop.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813 ATLASSERT(pMsgLoop != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 ATLASSERT(m_pMsgLoopMap->Lookup(::GetCurrentThreadId()) == NULL); // not in map yet
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816 BOOL bRet = m_pMsgLoopMap->Add(::GetCurrentThreadId(), pMsgLoop);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
821 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
822
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 BOOL RemoveMessageLoop()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveMessageLoop.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 BOOL bRet = m_pMsgLoopMap->Remove(::GetCurrentThreadId());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
834
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
835 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
836
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
837 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
838 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
839
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840 CMessageLoop* GetMessageLoop(DWORD dwThreadID = ::GetCurrentThreadId()) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::GetMessageLoop.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850 CMessageLoop* pLoop = m_pMsgLoopMap->Lookup(dwThreadID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 return pLoop;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
856
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
857 // Setting change notify methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 // Note: Call this from the main thread for MSDI apps
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859 BOOL InitSettingChangeNotify(DLGPROC pfnDlgProc = _SettingChangeDlgProc)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
863 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
864 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::InitSettingChangeNotify.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
868
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
869 if(m_pSettingChangeNotify == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
870 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
871 typedef ATL::CSimpleArray<HWND> _notifyClass;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872 ATLTRY(m_pSettingChangeNotify = new _notifyClass);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 ATLASSERT(m_pSettingChangeNotify != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876 BOOL bRet = (m_pSettingChangeNotify != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 if(bRet && (m_pSettingChangeNotify->GetSize() == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 // init everything
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880 _ATL_EMPTY_DLGTEMPLATE templ;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 HWND hNtfWnd = ::CreateDialogIndirect(GetModuleInstance(), &templ, NULL, pfnDlgProc);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 ATLASSERT(::IsWindow(hNtfWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 if(::IsWindow(hNtfWnd))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885 ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, (LONG_PTR)this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 bRet = m_pSettingChangeNotify->Add(hNtfWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
893
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
894 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
895
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
896 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
898
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
899 void TermSettingChangeNotify()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
903 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
904 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::TermSettingChangeNotify.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 return;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
908
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
909 if((m_pSettingChangeNotify != NULL) && (m_pSettingChangeNotify->GetSize() > 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 ::DestroyWindow((*m_pSettingChangeNotify)[0]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911 delete m_pSettingChangeNotify;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912 m_pSettingChangeNotify = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917 BOOL AddSettingChangeNotify(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddSettingChangeNotify.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
926
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
927 ATLASSERT(::IsWindow(hWnd));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929 if(InitSettingChangeNotify() != FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 bRet = m_pSettingChangeNotify->Add(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
931
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
932 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
933
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
934 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 BOOL RemoveSettingChangeNotify(HWND hWnd)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939 CStaticDataInitCriticalSectionLock lock;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 if(FAILED(lock.Lock()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
941 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
942 ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveSettingChangeNotify.\n"));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
946
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
947 BOOL bRet = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948 if(m_pSettingChangeNotify != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949 bRet = m_pSettingChangeNotify->Remove(hWnd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 lock.Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
955
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
956 // Implementation - setting change notify dialog template and dialog procedure
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 struct _ATL_EMPTY_DLGTEMPLATE : DLGTEMPLATE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 _ATL_EMPTY_DLGTEMPLATE()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961 memset(this, 0, sizeof(_ATL_EMPTY_DLGTEMPLATE));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 style = WS_POPUP;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
963 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
964 WORD wMenu, wClass, wTitle;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 static INT_PTR CALLBACK _SettingChangeDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
968 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
969 if(uMsg == WM_SETTINGCHANGE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
970 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
971 CAppModule* pModule = (CAppModule*)::GetWindowLongPtr(hWnd, GWLP_USERDATA);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972 ATLASSERT(pModule != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 ATLASSERT(pModule->m_pSettingChangeNotify != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974 const UINT uTimeout = 1500; // ms
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 for(int i = 1; i < pModule->m_pSettingChangeNotify->GetSize(); i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 ::SendMessageTimeout((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam, SMTO_ABORTIFHUNG, uTimeout, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
982 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
983 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
984
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 #if (_MSC_VER == 1400) // VS2005
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986 #pragma warning(pop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
989
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
990 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991 // CServerAppModule - module class for a COM server application
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993 class CServerAppModule : public CAppModule
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
994 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
995 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996 HANDLE m_hEventShutdown;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 bool m_bActivity;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 DWORD m_dwTimeOut;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 DWORD m_dwPause;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001 // Override of CAppModule::Init
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const GUID* pLibID = NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 m_dwTimeOut = 5000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 m_dwPause = 1000;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 return CAppModule::Init(pObjMap, hInstance, pLibID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1009 void Term()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1010 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1011 if((m_hEventShutdown != NULL) && ::CloseHandle(m_hEventShutdown))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 m_hEventShutdown = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013 CAppModule::Term();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1014 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1015
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 // COM Server methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 LONG Unlock() throw()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019 LONG lRet = CComModule::Unlock();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 if(lRet == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1021 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1022 m_bActivity = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 ::SetEvent(m_hEventShutdown); // tell monitor that we transitioned to zero
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1026 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1027
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028 void MonitorShutdown()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030 for(;;)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1032 ::WaitForSingleObject(m_hEventShutdown, INFINITE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1033 DWORD dwWait = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034 do
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036 m_bActivity = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 dwWait = ::WaitForSingleObject(m_hEventShutdown, m_dwTimeOut);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1038 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1039 while(dwWait == WAIT_OBJECT_0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 // timed out
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041 if(!m_bActivity && (m_nLockCnt == 0)) // if no activity let's really bail
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 #if defined(_WIN32_DCOM) && defined(_ATL_FREE_THREADED)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 ::CoSuspendClassObjects();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045 if(!m_bActivity && (m_nLockCnt == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1048 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1049 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1050 // This handle should be valid now. If it isn't,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 // check if _Module.Term was called first (it shouldn't)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052 if(::CloseHandle(m_hEventShutdown))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1053 m_hEventShutdown = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1054 ::PostThreadMessage(m_dwMainThreadID, WM_QUIT, 0, 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1056
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1057 bool StartMonitor()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 m_hEventShutdown = ::CreateEvent(NULL, false, false, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060 if(m_hEventShutdown == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 DWORD dwThreadID = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063 #ifdef _MT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064 HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, (UINT (WINAPI*)(void*))MonitorProc, this, 0, (UINT*)&dwThreadID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 HANDLE hThread = ::CreateThread(NULL, 0, MonitorProc, this, 0, &dwThreadID);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1067 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1068 bool bRet = (hThread != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070 ::CloseHandle(hThread);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1072 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1073
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 static DWORD WINAPI MonitorProc(void* pv)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076 CServerAppModule* p = (CServerAppModule*)pv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 p->MonitorShutdown();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 return 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1080 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1081
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1084 // CRegKeyEx - not used any more, here only for compatibility with old projects
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1085
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1086 typedef ATL::CRegKey CRegKeyEx;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 } // namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1089
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1090
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1091 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1092 // CString forward reference (enables CString use in atluser.h and atlgdi.h)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1093
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094 #if (defined(_WTL_USE_CSTRING) || defined(_WTL_FORWARD_DECLARE_CSTRING)) && !defined(__ATLSTR_H__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095 #include <atlstr.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1097
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1098 // CString namespace
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099 #define _CSTRING_NS ATL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1101 // Type classes namespace
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 #define _WTYPES_NS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1103
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1105 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106 // General DLL version helpers (removed in ATL11)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1108 #if (_ATL_VER >= 0x0B00)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1110 namespace ATL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1113 inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1114 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1115 ATLASSERT(pDllVersionInfo != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1116 if(pDllVersionInfo == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117 return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1119 // We must get this function explicitly because some DLLs don't implement it.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120 DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hInstDLL, "DllGetVersion");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 if(pfnDllGetVersion == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 return E_NOTIMPL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 return (*pfnDllGetVersion)(pDllVersionInfo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1126
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1127 inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1128 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1129 HINSTANCE hInstDLL = ::LoadLibrary(lpstrDllName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1130 if(hInstDLL == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 return E_FAIL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133 ::FreeLibrary(hInstDLL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134 return hRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1135 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1137 // Common Control Versions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1138 // Win95/WinNT 4.0 maj=4 min=00
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1139 // IE 3.x maj=4 min=70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1140 // IE 4.0 maj=4 min=71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141 inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 ATLASSERT((pdwMajor != NULL) && (pdwMinor != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144 if((pdwMajor == NULL) || (pdwMinor == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145 return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1146
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1147 DLLVERSIONINFO dvi;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1148 ::ZeroMemory(&dvi, sizeof(dvi));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1149 dvi.cbSize = sizeof(dvi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1150 HRESULT hRet = AtlGetDllVersion(_T("comctl32.dll"), &dvi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1152 if(SUCCEEDED(hRet))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1153 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1154 *pdwMajor = dvi.dwMajorVersion;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 *pdwMinor = dvi.dwMinorVersion;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1156 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1157 else if(hRet == E_NOTIMPL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1158 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1159 // If DllGetVersion is not there, then the DLL is a version
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 // previous to the one shipped with IE 3.x
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 *pdwMajor = 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 *pdwMinor = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1163 hRet = S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1164 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1165
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1166 return hRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1167 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 // Shell Versions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 // Win95/WinNT 4.0 maj=4 min=00
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 // IE 3.x, IE 4.0 without Web Integrated Desktop maj=4 min=00
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172 // IE 4.0 with Web Integrated Desktop maj=4 min=71
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173 // IE 4.01 with Web Integrated Desktop maj=4 min=72
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174 inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1175 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1176 ATLASSERT((pdwMajor != NULL) && (pdwMinor != NULL));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1177 if((pdwMajor == NULL) || (pdwMinor == NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1178 return E_INVALIDARG;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1180 DLLVERSIONINFO dvi;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1181 ::ZeroMemory(&dvi, sizeof(dvi));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1182 dvi.cbSize = sizeof(dvi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1183 HRESULT hRet = AtlGetDllVersion(_T("shell32.dll"), &dvi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1185 if(SUCCEEDED(hRet))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1186 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1187 *pdwMajor = dvi.dwMajorVersion;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 *pdwMinor = dvi.dwMinorVersion;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1189 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1190 else if(hRet == E_NOTIMPL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1191 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1192 // If DllGetVersion is not there, then the DLL is a version
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1193 // previous to the one shipped with IE 4.x
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194 *pdwMajor = 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195 *pdwMinor = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1196 hRet = S_OK;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1197 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1198
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1199 return hRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1201
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1202 } // namespace ATL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1203
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204 #endif // (_ATL_VER >= 0x0B00)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1206
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207 // These are always included
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 #include "atlwinx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209 #include "atluser.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 #include "atlgdi.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1212 #ifndef _WTL_NO_AUTOMATIC_NAMESPACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213 using namespace WTL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 #endif // !_WTL_NO_AUTOMATIC_NAMESPACE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216 #endif // __ATLAPP_H__