annotate foosdk/wtl/Include/atlmisc.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 __ATLMISC_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 #define __ATLMISC_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 __ATLAPP_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #error atlmisc.h requires atlapp.h to be included first
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 _WTL_NO_COMPATIBILITY_INCLUDES
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #include <atlstr.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 #include <atltypes.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 #endif // _WTL_NO_COMPATIBILITY_INCLUDES
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 // Classes in this file:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 // CRecentDocumentListBase<T, t_cchItemLen, t_nFirstID, t_nLastID>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 // CRecentDocumentList
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 // CFindFile
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 // CRegProperty
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 // CRegPropertyImpl<T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 // Global functions:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 // AtlGetStockPen()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 // AtlGetStockBrush()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 // AtlGetStockFont()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 // AtlGetStockPalette()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 // AtlCompactPath()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40
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 namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
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 // CSize scalar operators
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 #if !defined(_WTL_NO_SIZE_SCALAR) && defined(__ATLTYPES_H__)
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 template <class Num>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 inline CSize operator *(SIZE s, Num n)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 return CSize((int)(s.cx * n), (int)(s.cy * n));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 template <class Num>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 inline void operator *=(SIZE & s, Num n)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 s = s * n;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 };
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 template <class Num>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 inline CSize operator /(SIZE s, Num n)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 return CSize((int)(s.cx / n), (int)(s.cy / n));
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 template <class Num>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 inline void operator /=(SIZE & s, Num n)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 s = s / n;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 #endif // !defined(_WTL_NO_SIZE_SCALAR) && defined(__ATLTYPES_H__)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76
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 // CRecentDocumentList - MRU List Support
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 #ifndef _WTL_MRUEMPTY_TEXT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 #define _WTL_MRUEMPTY_TEXT _T("(empty)")
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 // forward declaration
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 inline bool AtlCompactPath(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen);
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 template <class T, int t_cchItemLen = MAX_PATH, int t_nFirstID = ID_FILE_MRU_FIRST, int t_nLastID = ID_FILE_MRU_LAST>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 class CRecentDocumentListBase
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 // Declarations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 struct _DocEntry
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 TCHAR szDocName[t_cchItemLen];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 bool operator ==(const _DocEntry& de) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 { return (lstrcmpi(szDocName, de.szDocName) == 0); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 enum
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 m_nMaxEntries_Min = 2,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 m_nMaxEntries_Max = t_nLastID - t_nFirstID + 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 m_cchMaxItemLen_Min = 6,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 m_cchMaxItemLen_Max = t_cchItemLen,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 m_cchItemNameLen = 11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 ATL::CSimpleArray<_DocEntry> m_arrDocs;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 int m_nMaxEntries; // default is 4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 HMENU m_hMenu;
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 TCHAR m_szNoEntries[t_cchItemLen];
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 int m_cchMaxItemLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 CRecentDocumentListBase() : m_nMaxEntries(4), m_hMenu(NULL), m_cchMaxItemLen(-1)
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 // These ASSERTs verify values of the template arguments
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 ATLASSERT(t_cchItemLen > m_cchMaxItemLen_Min);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 ATLASSERT(m_nMaxEntries_Max > m_nMaxEntries_Min);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 }
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 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 HMENU GetMenuHandle() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 return m_hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 void SetMenuHandle(HMENU hMenu)
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 ATLASSERT((hMenu == NULL) || ::IsMenu(hMenu));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 m_hMenu = hMenu;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 if((m_hMenu == NULL) || (::GetMenuString(m_hMenu, t_nFirstID, m_szNoEntries, t_cchItemLen, MF_BYCOMMAND) == 0))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 ATL::Checked::tcsncpy_s(m_szNoEntries, _countof(m_szNoEntries), pT->GetMRUEmptyText(), _TRUNCATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 int GetMaxEntries() const
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 return m_nMaxEntries;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 void SetMaxEntries(int nMaxEntries)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 ATLASSERT((nMaxEntries >= m_nMaxEntries_Min) && (nMaxEntries <= m_nMaxEntries_Max));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 if(nMaxEntries < m_nMaxEntries_Min)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 nMaxEntries = m_nMaxEntries_Min;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 else if(nMaxEntries > m_nMaxEntries_Max)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 nMaxEntries = m_nMaxEntries_Max;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 m_nMaxEntries = nMaxEntries;
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 int GetMaxItemLength() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 return m_cchMaxItemLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
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 void SetMaxItemLength(int cchMaxLen)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 ATLASSERT(((cchMaxLen >= m_cchMaxItemLen_Min) && (cchMaxLen <= m_cchMaxItemLen_Max)) || (cchMaxLen == -1));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 if(cchMaxLen != -1)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 if(cchMaxLen < m_cchMaxItemLen_Min)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 cchMaxLen = m_cchMaxItemLen_Min;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 else if(cchMaxLen > m_cchMaxItemLen_Max)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 cchMaxLen = m_cchMaxItemLen_Max;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 m_cchMaxItemLen = cchMaxLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 pT->UpdateMenu();
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 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 BOOL AddToList(LPCTSTR lpstrDocName)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 _DocEntry de;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 errno_t nRet = ATL::Checked::tcsncpy_s(de.szDocName, _countof(de.szDocName), lpstrDocName, _TRUNCATE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 if((nRet != 0) && (nRet != STRUNCATE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 for(int i = 0; i < m_arrDocs.GetSize(); i++)
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 if(lstrcmpi(m_arrDocs[i].szDocName, lpstrDocName) == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 m_arrDocs.RemoveAt(i);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 break;
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 if(m_arrDocs.GetSize() == m_nMaxEntries)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 m_arrDocs.RemoveAt(0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 BOOL bRet = m_arrDocs.Add(de);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 bRet = pT->UpdateMenu();
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 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 }
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 // This function is deprecated because it is not safe.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 // Use the version below that accepts the buffer length.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 __declspec(deprecated)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 BOOL GetFromList(int /*nItemID*/, LPTSTR /*lpstrDocName*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 return FALSE;
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 BOOL GetFromList(int nItemID, LPTSTR lpstrDocName, int cchLength)
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 int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 if((nIndex < 0) || (nIndex >= m_arrDocs.GetSize()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 if(lstrlen(m_arrDocs[nIndex].szDocName) >= cchLength)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 ATL::Checked::tcscpy_s(lpstrDocName, cchLength, m_arrDocs[nIndex].szDocName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 }
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 #ifdef __ATLSTR_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 BOOL GetFromList(int nItemID, ATL::CString& strDocName)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 if((nIndex < 0) || (nIndex >= m_arrDocs.GetSize()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 strDocName = m_arrDocs[nIndex].szDocName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 #endif // __ATLSTR_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 BOOL RemoveFromList(int nItemID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 BOOL bRet = m_arrDocs.RemoveAt(nIndex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 bRet = pT->UpdateMenu();
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 return bRet;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 BOOL MoveToTop(int nItemID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 if((nIndex < 0) || (nIndex >= m_arrDocs.GetSize()))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 _DocEntry de;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 de = m_arrDocs[nIndex];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 m_arrDocs.RemoveAt(nIndex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 BOOL bRet = m_arrDocs.Add(de);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 bRet = pT->UpdateMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268 BOOL ReadFromRegistry(LPCTSTR lpstrRegKey)
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 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271 ATL::CRegKey rkParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 ATL::CRegKey rk;
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 LONG lRet = rkParent.Open(HKEY_CURRENT_USER, lpstrRegKey);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 if(lRet != ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 lRet = rk.Open(rkParent, pT->GetRegKeyName());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 if(lRet != ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
279 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
280
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
281 DWORD dwRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
282 lRet = rk.QueryDWORDValue(pT->GetRegCountName(), dwRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
283 if(lRet != ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
284 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
285 SetMaxEntries(dwRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
286
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
287 m_arrDocs.RemoveAll();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
288
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
289 TCHAR szRetString[t_cchItemLen] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
290 _DocEntry de;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
291
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
292 for(int nItem = m_nMaxEntries; nItem > 0; nItem--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
293 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
294 TCHAR szBuff[m_cchItemNameLen] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
295 _stprintf_s(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
296 ULONG ulCount = t_cchItemLen;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
297 lRet = rk.QueryStringValue(szBuff, szRetString, &ulCount);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
298 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
299 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
300 ATL::Checked::tcscpy_s(de.szDocName, _countof(de.szDocName), szRetString);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
301 m_arrDocs.Add(de);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
302 }
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
305 rk.Close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
306 rkParent.Close();
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 return pT->UpdateMenu();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
309 }
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 BOOL WriteToRegistry(LPCTSTR lpstrRegKey)
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 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
314 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
315 ATL::CRegKey rkParent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
316 ATL::CRegKey rk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
317
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
318 LONG lRet = rkParent.Create(HKEY_CURRENT_USER, lpstrRegKey);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
319 if(lRet != ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
320 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
321 lRet = rk.Create(rkParent, pT->GetRegKeyName());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
322 if(lRet != ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
323 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
324
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
325 lRet = rk.SetDWORDValue(pT->GetRegCountName(), m_nMaxEntries);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
326 ATLASSERT(lRet == ERROR_SUCCESS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
327
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
328 // set new values
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
329 int nItem;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
330 for(nItem = m_arrDocs.GetSize(); nItem > 0; nItem--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
331 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
332 TCHAR szBuff[m_cchItemNameLen] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
333 _stprintf_s(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
334 TCHAR szDocName[t_cchItemLen] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
335 GetFromList(t_nFirstID + nItem - 1, szDocName, t_cchItemLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
336 lRet = rk.SetStringValue(szBuff, szDocName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
337 ATLASSERT(lRet == ERROR_SUCCESS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
338 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
339
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
340 // delete unused keys
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
341 for(nItem = m_arrDocs.GetSize() + 1; nItem <= m_nMaxEntries_Max; nItem++)
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 TCHAR szBuff[m_cchItemNameLen] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
344 _stprintf_s(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
345 rk.DeleteValue(szBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
346 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
348 rk.Close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
349 rkParent.Close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
350
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
351 return TRUE;
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 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
355 BOOL UpdateMenu()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
356 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
357 if(m_hMenu == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
358 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
359 ATLASSERT(::IsMenu(m_hMenu));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
360
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
361 int nItems = ::GetMenuItemCount(m_hMenu);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
362 int nInsertPoint = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
363 for(int i = 0; i < nItems; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
364 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
365 CMenuItemInfo mi;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
366 mi.fMask = MIIM_ID;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
367 ::GetMenuItemInfo(m_hMenu, i, TRUE, &mi);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
368 if (mi.wID == t_nFirstID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
369 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
370 nInsertPoint = i;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
371 break;
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 }
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 ATLASSERT((nInsertPoint < nItems) && "You need a menu item with an ID = t_nFirstID");
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 for(int j = t_nFirstID; j < (t_nFirstID + m_nMaxEntries); j++)
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 // keep the first one as an insertion point
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
380 if (j != t_nFirstID)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
381 ::DeleteMenu(m_hMenu, j, MF_BYCOMMAND);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
384 TCHAR szItemText[t_cchItemLen + 6] = {}; // add space for &, 2 digits, and a space
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
385 int nSize = m_arrDocs.GetSize();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
386 int nItem = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
387 if(nSize > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
388 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
389 for(nItem = 0; nItem < nSize; nItem++)
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 if(m_cchMaxItemLen == -1)
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 _stprintf_s(szItemText, t_cchItemLen + 6, _T("&%i %s"), nItem + 1, m_arrDocs[nSize - 1 - nItem].szDocName);
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 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
396 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
397 TCHAR szBuff[t_cchItemLen] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
398 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
399 (void)pT; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
400 bool bRet = pT->CompactDocumentName(szBuff, m_arrDocs[nSize - 1 - nItem].szDocName, m_cchMaxItemLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
401 (void)bRet; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
402 ATLASSERT(bRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
403 _stprintf_s(szItemText, t_cchItemLen + 6, _T("&%i %s"), nItem + 1, szBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
404 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
405
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
406 ::InsertMenu(m_hMenu, nInsertPoint + nItem, MF_BYPOSITION | MF_STRING, t_nFirstID + nItem, szItemText);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
407 }
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 else // empty
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 ::InsertMenu(m_hMenu, nInsertPoint, MF_BYPOSITION | MF_STRING, t_nFirstID, m_szNoEntries);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
412 ::EnableMenuItem(m_hMenu, t_nFirstID, MF_GRAYED);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
413 nItem++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
414 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
415 ::DeleteMenu(m_hMenu, nInsertPoint + nItem, MF_BYPOSITION);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
416
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
417 return TRUE;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
420 // Overrideables
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
421 // override to provide a different method of compacting document names
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
422 static bool CompactDocumentName(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
423 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
424 return AtlCompactPath(lpstrOut, lpstrIn, cchLen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
425 }
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 static LPCTSTR GetRegKeyName()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
428 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
429 return _T("Recent Document List");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
430 }
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 static LPCTSTR GetRegCountName()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
433 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
434 return _T("DocumentCount");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
435 }
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 static LPCTSTR GetRegItemName()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
438 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
439 // Note: This string is a format string used with wsprintf().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
440 // Resulting formatted string must be m_cchItemNameLen or less
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
441 // characters long, including the terminating null character.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
442 return _T("Document%i");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
443 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
444
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
445 static LPCTSTR GetMRUEmptyText()
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 return _WTL_MRUEMPTY_TEXT;
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 };
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 class CRecentDocumentList : public CRecentDocumentListBase<CRecentDocumentList>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
452 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
453 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
454 // nothing here
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
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 // CFindFile - file search helper class
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
460
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
461 class CFindFile
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
462 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
463 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
464 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
465 HANDLE m_hFind;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
466 WIN32_FIND_DATA m_fd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
467 LPTSTR m_lpszRoot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
468 const TCHAR m_chDirSeparator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
469 BOOL m_bFound;
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 // Constructor/destructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
472 CFindFile() : m_hFind(NULL), m_lpszRoot(NULL), m_chDirSeparator(_T('\\')), m_bFound(FALSE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
473 { }
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 ~CFindFile()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
476 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
477 Close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
478 }
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 // Attributes
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
481 ULONGLONG GetFileSize() const
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 ATLASSERT(m_hFind != NULL);
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 ULARGE_INTEGER nFileSize = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
486 if(m_bFound)
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 nFileSize.LowPart = m_fd.nFileSizeLow;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
489 nFileSize.HighPart = m_fd.nFileSizeHigh;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
490 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
491 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
492 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
493 nFileSize.QuadPart = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
496 return nFileSize.QuadPart;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
497 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
498
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
499 BOOL GetFileName(LPTSTR lpstrFileName, int cchLength) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
500 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
501 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
502 if(lstrlen(m_fd.cFileName) >= cchLength)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
503 return FALSE;
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 if(m_bFound)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
506 ATL::Checked::tcscpy_s(lpstrFileName, cchLength, m_fd.cFileName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
507
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
508 return m_bFound;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
511 BOOL GetFilePath(LPTSTR lpstrFilePath, int cchLength) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
512 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
513 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
514
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
515 int nLen = lstrlen(m_lpszRoot);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
516 ATLASSERT(nLen > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
517 if(nLen == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
518 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
519
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
520 bool bAddSep = (m_lpszRoot[nLen - 1] != m_chDirSeparator);
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 if((lstrlen(m_lpszRoot) + (bAddSep ? 1 : 0)) >= cchLength)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
523 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
524
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
525 ATL::Checked::tcscpy_s(lpstrFilePath, cchLength, m_lpszRoot);
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 if(bAddSep)
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 TCHAR szSeparator[2] = { m_chDirSeparator, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
530 ATL::Checked::tcscat_s(lpstrFilePath, cchLength, szSeparator);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
533 ATL::Checked::tcscat_s(lpstrFilePath, cchLength, m_fd.cFileName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
534
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
535 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
536 }
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 BOOL GetFileTitle(LPTSTR lpstrFileTitle, int cchLength) const
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 ATLASSERT(m_hFind != NULL);
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 TCHAR szBuff[MAX_PATH] = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
543 if(!GetFileName(szBuff, MAX_PATH))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
544 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
545
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
546 if((lstrlen(szBuff) >= cchLength) || (cchLength < 1))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
547 return FALSE;
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 // find the last dot
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
550 LPTSTR pstrDot = _tcsrchr(szBuff, _T('.'));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
551 if(pstrDot != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
552 *pstrDot = 0;
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 ATL::Checked::tcscpy_s(lpstrFileTitle, cchLength, szBuff);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
555
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
556 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
557 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
558
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
559 BOOL GetFileURL(LPTSTR lpstrFileURL, int cchLength) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
560 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
561 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
562
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
563 LPCTSTR lpstrFileURLPrefix = _T("file://");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
564 const int cchPrefix = lstrlen(lpstrFileURLPrefix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
565 if(cchPrefix >= cchLength)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
566 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
567
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
568 ATL::Checked::tcscpy_s(lpstrFileURL, cchLength, lpstrFileURLPrefix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
569
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
570 return GetFilePath(&lpstrFileURL[cchPrefix], cchLength - cchPrefix);
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 BOOL GetRoot(LPTSTR lpstrRoot, int cchLength) const
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 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
576 if(lstrlen(m_lpszRoot) >= cchLength)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
577 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
578
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
579 ATL::Checked::tcscpy_s(lpstrRoot, cchLength, m_lpszRoot);
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 return TRUE;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
584 #ifdef __ATLSTR_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
585 ATL::CString GetFileName() const
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 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
588
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
589 ATL::CString ret;
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 if(m_bFound)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
592 ret = m_fd.cFileName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
593 return ret;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
596 ATL::CString GetFilePath() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
597 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
598 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
599
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
600 ATL::CString strResult = m_lpszRoot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
601 int nLen = strResult.GetLength();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
602 ATLASSERT(nLen > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
603 if(nLen == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
604 return strResult;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
605
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
606 if(strResult[nLen - 1] != m_chDirSeparator)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
607 strResult += m_chDirSeparator;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
608 strResult += GetFileName();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
609 return strResult;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
612 ATL::CString GetFileTitle() const
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 ATLASSERT(m_hFind != NULL);
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 ATL::CString strResult;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
617 GetFileTitle(strResult.GetBuffer(MAX_PATH), MAX_PATH);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
618 strResult.ReleaseBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
619
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
620 return strResult;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
623 ATL::CString GetFileURL() const
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 ATLASSERT(m_hFind != NULL);
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 ATL::CString strResult("file://");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
628 strResult += GetFilePath();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
629 return strResult;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
630 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
631
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
632 ATL::CString GetRoot() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
633 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
634 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
635
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
636 ATL::CString str = m_lpszRoot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
637 return str;
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 #endif // __ATLSTR_H__
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 BOOL GetLastWriteTime(FILETIME* pTimeStamp) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
642 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
643 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
644 ATLASSERT(pTimeStamp != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
645
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
646 if(m_bFound && (pTimeStamp != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
647 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
648 *pTimeStamp = m_fd.ftLastWriteTime;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
649 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
650 }
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 return FALSE;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
655 BOOL GetLastAccessTime(FILETIME* pTimeStamp) const
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 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
658 ATLASSERT(pTimeStamp != NULL);
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 if(m_bFound && (pTimeStamp != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
661 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
662 *pTimeStamp = m_fd.ftLastAccessTime;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
663 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
664 }
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 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
667 }
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 BOOL GetCreationTime(FILETIME* pTimeStamp) const
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 ATLASSERT(m_hFind != NULL);
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 if(m_bFound && (pTimeStamp != NULL))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
674 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
675 *pTimeStamp = m_fd.ftCreationTime;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
676 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
677 }
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 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
680 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
681
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
682 BOOL MatchesMask(DWORD dwMask) const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
683 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
684 ATLASSERT(m_hFind != NULL);
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 if(m_bFound)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
687 return ((m_fd.dwFileAttributes & dwMask) != 0);
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 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
690 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
691
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
692 BOOL IsDots() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
693 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
694 ATLASSERT(m_hFind != NULL);
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 // return TRUE if the file name is "." or ".." and
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
697 // the file is a directory
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
698
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
699 BOOL bResult = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
700 if(m_bFound && IsDirectory())
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 if((m_fd.cFileName[0] == _T('.')) && ((m_fd.cFileName[1] == _T('\0')) || ((m_fd.cFileName[1] == _T('.')) && (m_fd.cFileName[2] == _T('\0')))))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
703 bResult = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
704 }
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 return bResult;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
709 BOOL IsReadOnly() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
710 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
711 return MatchesMask(FILE_ATTRIBUTE_READONLY);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
712 }
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 BOOL IsDirectory() const
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 return MatchesMask(FILE_ATTRIBUTE_DIRECTORY);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
719 BOOL IsCompressed() const
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 return MatchesMask(FILE_ATTRIBUTE_COMPRESSED);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
724 BOOL IsSystem() const
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 return MatchesMask(FILE_ATTRIBUTE_SYSTEM);
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 BOOL IsHidden() const
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 MatchesMask(FILE_ATTRIBUTE_HIDDEN);
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 BOOL IsTemporary() const
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 return MatchesMask(FILE_ATTRIBUTE_TEMPORARY);
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 BOOL IsNormal() const
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 return MatchesMask(FILE_ATTRIBUTE_NORMAL);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
744 BOOL IsArchived() const
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 return MatchesMask(FILE_ATTRIBUTE_ARCHIVE);
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 // Operations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
750 BOOL FindFile(LPCTSTR pstrName = NULL, bool bAutoLongPath = false)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
751 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
752 Close();
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 if(pstrName == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
755 pstrName = _T("*.*");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
756
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
757 if(bAutoLongPath && (lstrlen(pstrName) >= MAX_PATH))
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 LPCTSTR lpstrPrefix = _T("\\\\?\\");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
760 int cchLongPath = lstrlen(lpstrPrefix) + lstrlen(pstrName) + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
761 ATL::CTempBuffer<TCHAR, _WTL_STACK_ALLOC_THRESHOLD> buff;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
762 LPTSTR lpstrLongPath = buff.Allocate(cchLongPath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
763 if(lpstrLongPath != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
764 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
765 ATL::Checked::tcscpy_s(lpstrLongPath, cchLongPath, lpstrPrefix);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
766 ATL::Checked::tcscat_s(lpstrLongPath, cchLongPath, pstrName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
767 m_hFind = ::FindFirstFile(lpstrLongPath, &m_fd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
768 }
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 else
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 m_hFind = ::FindFirstFile(pstrName, &m_fd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
773 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
774
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
775 if(m_hFind == INVALID_HANDLE_VALUE)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
776 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
777
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
778 int cchRoot = ::GetFullPathName(pstrName, 0, NULL, NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
779 if(cchRoot > 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
780 ATLTRY(m_lpszRoot = new TCHAR[cchRoot]);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
781 if(m_lpszRoot == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
782 return FALSE;
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 bool bFullPath = (::GetFullPathName(pstrName, cchRoot, m_lpszRoot, NULL) != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
785
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
786 // passed name isn't a valid path but was found by the API
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
787 ATLASSERT(bFullPath);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
788 if(!bFullPath)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
789 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
790 Close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
791 ::SetLastError(ERROR_INVALID_NAME);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
792 return FALSE;
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 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
795 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
796 // find the last separator
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
797 LPTSTR pstrSep = _tcsrchr(m_lpszRoot, m_chDirSeparator);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
798 if(pstrSep != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
799 *pstrSep = _T('\0');
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 m_bFound = TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
803
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
804 return TRUE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
805 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
806
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
807 BOOL FindNextFile()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
808 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
809 ATLASSERT(m_hFind != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
810
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
811 if(m_hFind == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
812 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
813
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
814 if(!m_bFound)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
815 return FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
816
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
817 m_bFound = ::FindNextFile(m_hFind, &m_fd);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
818
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
819 return m_bFound;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
820 }
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 void Close()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
823 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
824 m_bFound = FALSE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
825
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
826 delete [] m_lpszRoot;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
827 m_lpszRoot = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
828
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
829 if((m_hFind != NULL) && (m_hFind != INVALID_HANDLE_VALUE))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
830 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
831 ::FindClose(m_hFind);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
832 m_hFind = NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
833 }
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 };
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
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 // CRegProperty and CRegPropertyImpl<> - properties stored in registry
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
840
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
841 // How to use: Derive a class from CRegPropertyImpl, add data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
842 // for properties, and add REGPROP map to map properties to registry value names.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
843 // You can then call Read() and Write() methods to read and write properties to/from registry.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
844 // You can also use CRegProperty class directly, for one time read/write, or for custom stuff.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
845
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
846 #define REGPROP_CURRENTUSER 0x0000
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
847 #define REGPROP_LOCALMACHINE 0x0001
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
848 #define REGPROP_READONLY 0x0002
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
849 #define REGPROP_WRITEONLY 0x0004
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
850
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
851 class CRegProperty
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
852 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
853 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
854 // Type declarations
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
855 struct BinaryProp
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 void* pBinary;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
858 ULONG uSize; // buffer size in bytes, used size after read
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
859
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
860 BinaryProp() : pBinary(NULL), uSize(0U)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
861 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
862 };
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 struct CharArrayProp
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
865 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
866 LPTSTR lpstrText;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
867 ULONG uSize; // buffer size in chars
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 CharArrayProp() : lpstrText(NULL), uSize(0U)
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 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
872
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
873 // Data members
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
874 ATL::CRegKey m_regkey;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
875 WORD m_wFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
876
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
877 // Constructor
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
878 CRegProperty() : m_wFlags(REGPROP_CURRENTUSER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
879 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
880
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
881 // Registry key methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
882 LSTATUS OpenRegKey(LPCTSTR lpstrRegKey, bool bWrite)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
883 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
884 ATLASSERT(m_regkey.m_hKey == NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
885
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
886 HKEY hKey = ((m_wFlags & REGPROP_LOCALMACHINE) != 0) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
887 REGSAM sam = KEY_READ | KEY_WRITE;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
888 LSTATUS lRet = -1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
889 if(bWrite)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
890 lRet = m_regkey.Create(hKey, lpstrRegKey, NULL, 0, ((m_wFlags & REGPROP_WRITEONLY) != 0) ? KEY_WRITE : sam);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
891 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
892 lRet = m_regkey.Open(hKey, lpstrRegKey, ((m_wFlags & REGPROP_READONLY) != 0) ? KEY_READ : sam);
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 return lRet;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
897 void CloseRegKey()
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 LSTATUS lRet = m_regkey.Close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
900 (void)lRet; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
901 ATLASSERT(lRet == ERROR_SUCCESS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
902 }
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 // Flag methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
905 WORD GetFlags() const
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
906 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
907 return m_wFlags;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
910 WORD SetFlags(WORD wFlags, WORD wMask = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
911 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
912 WORD wPrevFlags = m_wFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
913 if(wMask == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
914 m_wFlags = wFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
915 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
916 m_wFlags = (m_wFlags & ~wMask) | (wFlags & wMask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
917
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
918 return wPrevFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
919 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
920
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
921 // Generic read/write methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
922 template <class TProp>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
923 LSTATUS ReadProp(LPCTSTR lpstrRegValue, TProp& prop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
924 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
925 ATLASSERT(m_regkey.m_hKey != NULL);
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 DWORD dwRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
928 LSTATUS lRet = m_regkey.QueryDWORDValue(lpstrRegValue, dwRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
929 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
930 prop = static_cast<TProp>(dwRet);
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 return lRet;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
935 template <class TProp>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
936 LSTATUS WriteProp(LPCTSTR lpstrRegValue, TProp& prop)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
937 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
938 ATLASSERT(m_regkey.m_hKey != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
939
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
940 return m_regkey.SetDWORDValue(lpstrRegValue, (DWORD)prop);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
943 // Specialization for bool
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
944 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
945 LSTATUS ReadProp(LPCTSTR lpstrRegValue, bool& bProp)
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 ATLASSERT(m_regkey.m_hKey != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
948
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
949 DWORD dwRet = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
950 LSTATUS lRet = m_regkey.QueryDWORDValue(lpstrRegValue, dwRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
951 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
952 bProp = (dwRet != 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
953
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
954 return lRet;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
957 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
958 LSTATUS WriteProp(LPCTSTR lpstrRegValue, bool& bProp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
959 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
960 ATLASSERT(m_regkey.m_hKey != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
961
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
962 return m_regkey.SetDWORDValue(lpstrRegValue, bProp ? 1 : 0);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
965 // Specialization for HFONT
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
966 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
967 LSTATUS ReadProp(LPCTSTR lpstrRegValue, HFONT& hFont)
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 ATLASSERT(m_regkey.m_hKey != NULL);
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 LOGFONT lf = {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
972 ULONG uSize = sizeof(lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
973 LSTATUS lRet = m_regkey.QueryBinaryValue(lpstrRegValue, &lf, &uSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
974 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
975 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
976 if(hFont != NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
977 ::DeleteObject(hFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
978
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
979 hFont = ::CreateFontIndirect(&lf);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
980 if(hFont == NULL)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
981 lRet = ERROR_INVALID_DATA;
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 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
985 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
986
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
987 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
988 LSTATUS WriteProp(LPCTSTR lpstrRegValue, HFONT& hFont)
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 ATLASSERT(m_regkey.m_hKey != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
991
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
992 CLogFont lf(hFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
993 return m_regkey.SetBinaryValue(lpstrRegValue, &lf, sizeof(lf));
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
996 // Specialization for BinaryProp
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
997 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
998 LSTATUS ReadProp(LPCTSTR lpstrRegValue, BinaryProp& binProp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
999 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1000 ATLASSERT(m_regkey.m_hKey != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1001
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1002 ULONG uSize = 0U;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1003 LSTATUS lRet = m_regkey.QueryBinaryValue(lpstrRegValue, NULL, &uSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1004 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1005 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1006 if(uSize <= binProp.uSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1007 lRet = m_regkey.QueryBinaryValue(lpstrRegValue, binProp.pBinary, &binProp.uSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1008 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1009 lRet = ERROR_OUTOFMEMORY;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1012 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1013 }
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 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1016 LSTATUS WriteProp(LPCTSTR lpstrRegValue, BinaryProp& binProp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1017 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1018 ATLASSERT(m_regkey.m_hKey != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1019
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1020 return m_regkey.SetBinaryValue(lpstrRegValue, binProp.pBinary, binProp.uSize);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1023 // Specialization for CharArrayProp
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1024 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1025 LSTATUS ReadProp(LPCTSTR lpstrRegValue, CharArrayProp& caProp)
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 ATLASSERT(m_regkey.m_hKey != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1028
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1029 ULONG uSize = 0U;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1030 LSTATUS lRet = m_regkey.QueryStringValue(lpstrRegValue, NULL, &uSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1031 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1032 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1033 if(uSize <= caProp.uSize)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1034 lRet = m_regkey.QueryStringValue(lpstrRegValue, caProp.lpstrText, &caProp.uSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1035 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1036 lRet = ERROR_OUTOFMEMORY;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1037 }
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 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1040 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1041
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1042 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1043 LSTATUS WriteProp(LPCTSTR lpstrRegValue, CharArrayProp& caProp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1044 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1045 ATLASSERT(m_regkey.m_hKey != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1046
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1047 return m_regkey.SetStringValue(lpstrRegValue, caProp.lpstrText);
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 // Specialization for CString
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1051 #ifdef __ATLSTR_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1052 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1053 LSTATUS ReadProp(LPCTSTR lpstrRegValue, ATL::CString& strProp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1054 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1055 ATLASSERT(m_regkey.m_hKey != NULL);
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 ULONG uSize = 0U;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1058 LSTATUS lRet = m_regkey.QueryStringValue(lpstrRegValue, NULL, &uSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1059 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1060 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1061 lRet = m_regkey.QueryStringValue(lpstrRegValue, strProp.GetBufferSetLength(uSize), &uSize);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1062 strProp.ReleaseBuffer();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1063 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1064
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1065 return lRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1066 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1067
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1068 template <>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1069 LSTATUS WriteProp(LPCTSTR lpstrRegValue, ATL::CString& strProp)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1070 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1071 ATLASSERT(m_regkey.m_hKey != NULL);
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 return m_regkey.SetStringValue(lpstrRegValue, (LPCTSTR)strProp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1074 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1075 #endif // __ATLSTR_H__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1076
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1077 // Static methods for one time read/write
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1078 template <class TProp>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1079 static bool ReadOne(LPCTSTR lpstrRegKey, LPCTSTR lpstrRegValue, TProp& prop, WORD wFlags = REGPROP_CURRENTUSER)
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 CRegProperty rp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1082 rp.SetFlags(wFlags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1083 LSTATUS lRet = rp.OpenRegKey(lpstrRegKey, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1084 if(lRet == ERROR_SUCCESS)
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 lRet = rp.ReadProp(lpstrRegValue, prop);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1087 rp.CloseRegKey();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1088 }
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 return (lRet == ERROR_SUCCESS) || (lRet == ERROR_FILE_NOT_FOUND);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1093 template <class TProp>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1094 static bool WriteOne(LPCTSTR lpstrRegKey, LPCTSTR lpstrRegValue, TProp& prop, WORD wFlags = REGPROP_CURRENTUSER)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1095 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1096 CRegProperty rp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1097 rp.SetFlags(wFlags);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1098 LSTATUS lRet = rp.OpenRegKey(lpstrRegKey, true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1099 if(lRet == ERROR_SUCCESS)
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 lRet = rp.WriteProp(lpstrRegValue, prop);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1102 rp.CloseRegKey();
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 return (lRet == ERROR_SUCCESS);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1106 }
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
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 #define BEGIN_REGPROP_MAP(class) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1111 void ReadWriteAll(bool bWrite) \
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1114 #define REG_PROPERTY(name, prop) \
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1115 this->ReadWriteProp(name, prop, bWrite);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1116
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1117 #define END_REGPROP_MAP() \
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1120 template <class T>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1121 class CRegPropertyImpl : public CRegProperty
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1122 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1123 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1124 // Methods
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1125 void Read(LPCTSTR lpstrRegKey)
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 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1128 LSTATUS lRet = pT->OpenRegKey(lpstrRegKey, false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1129 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1130 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1131 pT->ReadWriteAll(false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1132 pT->OnRead(lpstrRegKey);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1133
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1134 pT->CloseRegKey();
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 else if(lRet != ERROR_FILE_NOT_FOUND)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1137 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1138 pT->OnReadError(NULL, lRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1139 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1140 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1142 void Write(LPCTSTR lpstrRegKey)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1143 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1144 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1145 LSTATUS lRet = pT->OpenRegKey(lpstrRegKey, true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1146 if(lRet == ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1147 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1148 pT->ReadWriteAll(true);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1149 pT->OnWrite(lpstrRegKey);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1150
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1151 pT->CloseRegKey();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1152 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1153 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1154 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1155 pT->OnWriteError(NULL, lRet);
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 }
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 // Implementation
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1160 template <class TProp>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1161 void ReadWriteProp(LPCTSTR lpstrRegValue, TProp& prop, bool bWrite)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1162 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1163 T* pT = static_cast<T*>(this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1164 if(bWrite)
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 LSTATUS lRet = pT->WriteProp(lpstrRegValue, prop);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1167 if(lRet != ERROR_SUCCESS)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1168 pT->OnWriteError(lpstrRegValue, lRet);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1169 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1170 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1171 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1172 LSTATUS lRet = pT->ReadProp(lpstrRegValue, prop);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1173 if((lRet != ERROR_SUCCESS) && (lRet != ERROR_FILE_NOT_FOUND))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1174 pT->OnReadError(lpstrRegValue, lRet);
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 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1178 // Overrideable handlers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1179 void OnRead(LPCTSTR /*lpstrRegValue*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1180 { }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1182 void OnWrite(LPCTSTR /*lpstrRegValue*/)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1183 { }
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 void OnReadError(LPCTSTR /*lpstrRegValue*/, LSTATUS /*lError*/)
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 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1188 }
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 void OnWriteError(LPCTSTR /*lpstrRegValue*/, LSTATUS /*lError*/)
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 ATLASSERT(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1193 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1194 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1196
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 // Global functions for stock GDI objects
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1199
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1200 inline HPEN AtlGetStockPen(int nPen)
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 ATLASSERT((nPen == WHITE_PEN) || (nPen == BLACK_PEN) || (nPen == NULL_PEN) || (nPen == DC_PEN));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1203 return (HPEN)::GetStockObject(nPen);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1204 }
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 inline HBRUSH AtlGetStockBrush(int nBrush)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1207 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1208 ATLASSERT(((nBrush >= WHITE_BRUSH) && (nBrush <= HOLLOW_BRUSH)) || (nBrush == DC_BRUSH));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1209 return (HBRUSH)::GetStockObject(nBrush);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1210 }
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 inline HFONT AtlGetStockFont(int nFont)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1213 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1214 ATLASSERT(((nFont >= OEM_FIXED_FONT) && (nFont <= SYSTEM_FIXED_FONT)) || (nFont == DEFAULT_GUI_FONT));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1215 return (HFONT)::GetStockObject(nFont);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1216 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1217
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1218 inline HPALETTE AtlGetStockPalette(int nPalette)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1219 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1220 ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supported
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1221 return (HPALETTE)::GetStockObject(nPalette);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1224
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1225 ///////////////////////////////////////////////////////////////////////////////
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1226 // Global function for compacting a path by replacing parts with ellipsis
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1227
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1228 // helper for multi-byte character sets
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1229 inline bool _IsDBCSTrailByte(LPCTSTR lpstr, int nChar)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1230 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1231 #ifndef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1232 int i = nChar;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1233 for( ; i > 0; i--)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1234 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1235 if(!::IsDBCSLeadByte(lpstr[i - 1]))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1236 break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1237 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1238 return ((nChar > 0) && (((nChar - i) & 1) != 0));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1239 #else // _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1240 (void)lpstr; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1241 (void)nChar; // avoid level 4 warning
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1242 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1243 #endif // _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1244 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1245
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1246 inline bool AtlCompactPath(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1247 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1248 ATLASSERT(lpstrOut != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1249 ATLASSERT(lpstrIn != NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1250 ATLASSERT(cchLen > 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1251
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1252 LPCTSTR szEllipsis = _T("...");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1253 const int cchEndEllipsis = 3;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1254 const int cchMidEllipsis = 4;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1256 if(lstrlen(lpstrIn) < cchLen)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1257 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1258 ATL::Checked::tcscpy_s(lpstrOut, cchLen, lpstrIn);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1259 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1260 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1261
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1262 lpstrOut[0] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1263
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1264 // check if the separator is a slash or a backslash
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1265 TCHAR chSlash = _T('\\');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1266 for(LPTSTR lpstr = (LPTSTR)lpstrIn; *lpstr != 0; lpstr = ::CharNext(lpstr))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1267 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1268 if((*lpstr == _T('/')) || (*lpstr == _T('\\')))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1269 chSlash = *lpstr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1270 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1271
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1272 // find the filename portion of the path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1273 LPCTSTR lpstrFileName = lpstrIn;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1274 for(LPCTSTR pPath = lpstrIn; *pPath; pPath = ::CharNext(pPath))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1275 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1276 if(((pPath[0] == _T('\\')) || (pPath[0] == _T(':')) || (pPath[0] == _T('/')))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1277 && pPath[1] && (pPath[1] != _T('\\')) && (pPath[1] != _T('/')))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1278 lpstrFileName = pPath + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1279 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1280 int cchFileName = lstrlen(lpstrFileName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1281
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1282 // handle just the filename without a path
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1283 if((lpstrFileName == lpstrIn) && (cchLen > cchEndEllipsis))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1284 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1285 bool bRet = (ATL::Checked::tcsncpy_s(lpstrOut, cchLen, lpstrIn, cchLen - cchEndEllipsis - 1) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1286 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1287 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1288 #ifndef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1289 if(_IsDBCSTrailByte(lpstrIn, cchLen - cchEndEllipsis))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1290 lpstrOut[cchLen - cchEndEllipsis - 1] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1291 #endif // _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1292 ATL::Checked::tcscat_s(lpstrOut, cchLen, szEllipsis);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1293 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1294 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1295 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1296
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1297 // handle just ellipsis
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1298 if((cchLen < (cchMidEllipsis + cchEndEllipsis)))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1299 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1300 for(int i = 0; i < cchLen - 1; i++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1301 lpstrOut[i] = ((i + 1) == cchMidEllipsis) ? chSlash : _T('.');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1302 lpstrOut[cchLen - 1] = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1303 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1304 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1305
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1306 // calc how much we have to copy
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1307 int cchToCopy = cchLen - (cchMidEllipsis + cchFileName) - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1308
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1309 if(cchToCopy < 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1310 cchToCopy = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1311
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1312 #ifndef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1313 if((cchToCopy > 0) && _IsDBCSTrailByte(lpstrIn, cchToCopy))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1314 cchToCopy--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1315 #endif // _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1316
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1317 bool bRet = (ATL::Checked::tcsncpy_s(lpstrOut, cchLen, lpstrIn, cchToCopy) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1318 if(!bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1319 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1320
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1321 // add ellipsis
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1322 ATL::Checked::tcscat_s(lpstrOut, cchLen, szEllipsis);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1323 TCHAR szSlash[2] = { chSlash, 0 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1324 ATL::Checked::tcscat_s(lpstrOut, cchLen, szSlash);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1325
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1326 // add filename (and ellipsis, if needed)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1327 if(cchLen > (cchMidEllipsis + cchFileName))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1328 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1329 ATL::Checked::tcscat_s(lpstrOut, cchLen, lpstrFileName);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1330 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1331 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1332 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1333 cchToCopy = cchLen - cchMidEllipsis - cchEndEllipsis - 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1334 #ifndef _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1335 if((cchToCopy > 0) && _IsDBCSTrailByte(lpstrFileName, cchToCopy))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1336 cchToCopy--;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1337 #endif // _UNICODE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1338 bRet = (ATL::Checked::tcsncpy_s(&lpstrOut[cchMidEllipsis], cchLen - cchMidEllipsis, lpstrFileName, cchToCopy) == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1339 if(bRet)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1340 ATL::Checked::tcscat_s(lpstrOut, cchLen, szEllipsis);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1341 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1342
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1343 return bRet;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1344 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1345
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1346 } // namespace WTL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1347
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1348 #endif // __ATLMISC_H__