aboutsummaryrefslogtreecommitdiff
path: root/CPP/Windows
diff options
context:
space:
mode:
Diffstat (limited to 'CPP/Windows')
-rw-r--r--CPP/Windows/COM.h32
-rw-r--r--CPP/Windows/Clipboard.h6
-rw-r--r--CPP/Windows/CommonDialog.cpp291
-rw-r--r--CPP/Windows/CommonDialog.h44
-rw-r--r--CPP/Windows/Console.h4
-rw-r--r--CPP/Windows/Control/ComboBox.cpp8
-rw-r--r--CPP/Windows/Control/ComboBox.h22
-rw-r--r--CPP/Windows/Control/CommandBar.h12
-rw-r--r--CPP/Windows/Control/Dialog.cpp51
-rw-r--r--CPP/Windows/Control/Dialog.h114
-rw-r--r--CPP/Windows/Control/Edit.h4
-rw-r--r--CPP/Windows/Control/ImageList.h6
-rw-r--r--CPP/Windows/Control/ListView.cpp47
-rw-r--r--CPP/Windows/Control/ListView.h51
-rw-r--r--CPP/Windows/Control/ProgressBar.h24
-rw-r--r--CPP/Windows/Control/PropertyPage.cpp90
-rw-r--r--CPP/Windows/Control/PropertyPage.h20
-rw-r--r--CPP/Windows/Control/ReBar.h6
-rw-r--r--CPP/Windows/Control/Static.h4
-rw-r--r--CPP/Windows/Control/StatusBar.h10
-rw-r--r--CPP/Windows/Control/StdAfx.h7
-rw-r--r--CPP/Windows/Control/ToolBar.h6
-rw-r--r--CPP/Windows/Control/Trackbar.h4
-rw-r--r--CPP/Windows/Control/Window2.cpp14
-rw-r--r--CPP/Windows/Control/Window2.h16
-rw-r--r--CPP/Windows/DLL.cpp50
-rw-r--r--CPP/Windows/DLL.h49
-rw-r--r--CPP/Windows/Defs.h5
-rw-r--r--CPP/Windows/ErrorMsg.cpp8
-rw-r--r--CPP/Windows/ErrorMsg.h4
-rw-r--r--CPP/Windows/FileDir.cpp235
-rw-r--r--CPP/Windows/FileDir.h6
-rw-r--r--CPP/Windows/FileFind.cpp36
-rw-r--r--CPP/Windows/FileFind.h14
-rw-r--r--CPP/Windows/FileIO.cpp38
-rw-r--r--CPP/Windows/FileIO.h51
-rw-r--r--CPP/Windows/FileLink.cpp79
-rw-r--r--CPP/Windows/FileMapping.h6
-rw-r--r--CPP/Windows/FileName.cpp171
-rw-r--r--CPP/Windows/FileName.h38
-rw-r--r--CPP/Windows/FileSystem.cpp24
-rw-r--r--CPP/Windows/FileSystem.h4
-rw-r--r--CPP/Windows/Handle.h8
-rw-r--r--CPP/Windows/MemoryGlobal.h12
-rw-r--r--CPP/Windows/MemoryLock.cpp28
-rw-r--r--CPP/Windows/MemoryLock.h4
-rw-r--r--CPP/Windows/Menu.cpp155
-rw-r--r--CPP/Windows/Menu.h52
-rw-r--r--CPP/Windows/NationalTime.cpp8
-rw-r--r--CPP/Windows/NationalTime.h4
-rw-r--r--CPP/Windows/Net.cpp56
-rw-r--r--CPP/Windows/Net.h5
-rw-r--r--CPP/Windows/NtCheck.h14
-rw-r--r--CPP/Windows/ProcessMessages.h4
-rw-r--r--CPP/Windows/ProcessUtils.cpp22
-rw-r--r--CPP/Windows/ProcessUtils.h56
-rw-r--r--CPP/Windows/PropVariant.cpp8
-rw-r--r--CPP/Windows/PropVariant.h10
-rw-r--r--CPP/Windows/PropVariantConv.cpp10
-rw-r--r--CPP/Windows/PropVariantConv.h4
-rw-r--r--CPP/Windows/PropVariantUtils.h12
-rw-r--r--CPP/Windows/Registry.h4
-rw-r--r--CPP/Windows/ResourceString.h5
-rw-r--r--CPP/Windows/SecurityUtils.cpp38
-rw-r--r--CPP/Windows/SecurityUtils.h12
-rw-r--r--CPP/Windows/Shell.cpp574
-rw-r--r--CPP/Windows/Shell.h62
-rw-r--r--CPP/Windows/StdAfx.h8
-rw-r--r--CPP/Windows/Synchronization.cpp24
-rw-r--r--CPP/Windows/Synchronization.h50
-rw-r--r--CPP/Windows/System.cpp58
-rw-r--r--CPP/Windows/System.h17
-rw-r--r--CPP/Windows/SystemInfo.cpp291
-rw-r--r--CPP/Windows/SystemInfo.h5
-rw-r--r--CPP/Windows/Thread.h6
-rw-r--r--CPP/Windows/TimeUtils.cpp4
-rw-r--r--CPP/Windows/TimeUtils.h4
-rw-r--r--CPP/Windows/Window.cpp10
-rw-r--r--CPP/Windows/Window.h113
79 files changed, 2345 insertions, 1123 deletions
diff --git a/CPP/Windows/COM.h b/CPP/Windows/COM.h
index cee7f70..a8780ca 100644
--- a/CPP/Windows/COM.h
+++ b/CPP/Windows/COM.h
@@ -1,9 +1,9 @@
1// Windows/COM.h 1// Windows/COM.h
2 2
3#ifndef __WINDOWS_COM_H 3#ifndef ZIP7_INC_WINDOWS_COM_H
4#define __WINDOWS_COM_H 4#define ZIP7_INC_WINDOWS_COM_H
5 5
6#include "../Common/MyString.h" 6// #include "../Common/MyString.h"
7 7
8namespace NWindows { 8namespace NWindows {
9namespace NCOM { 9namespace NCOM {
@@ -21,17 +21,18 @@ public:
21 // it's single thread. Do we need multithread? 21 // it's single thread. Do we need multithread?
22 CoInitialize(NULL); 22 CoInitialize(NULL);
23 #endif 23 #endif
24 }; 24 }
25 ~CComInitializer() { CoUninitialize(); } 25 ~CComInitializer() { CoUninitialize(); }
26}; 26};
27 27
28class CStgMedium 28/*
29class CStgMedium2
29{ 30{
30 STGMEDIUM _object; 31 STGMEDIUM _object;
31public:
32 bool _mustBeReleased; 32 bool _mustBeReleased;
33 CStgMedium(): _mustBeReleased(false) {} 33public:
34 ~CStgMedium() { Free(); } 34 CStgMedium2(): _mustBeReleased(false) {}
35 ~CStgMedium2() { Free(); }
35 void Free() 36 void Free()
36 { 37 {
37 if (_mustBeReleased) 38 if (_mustBeReleased)
@@ -42,6 +43,21 @@ public:
42 STGMEDIUM* operator->() { return &_object;} 43 STGMEDIUM* operator->() { return &_object;}
43 STGMEDIUM* operator&() { return &_object; } 44 STGMEDIUM* operator&() { return &_object; }
44}; 45};
46*/
47
48struct CStgMedium: public STGMEDIUM
49{
50 CStgMedium()
51 {
52 tymed = TYMED_NULL; // 0
53 hGlobal = NULL;
54 pUnkForRelease = NULL;
55 }
56 ~CStgMedium()
57 {
58 ReleaseStgMedium(this);
59 }
60};
45 61
46#endif 62#endif
47 63
diff --git a/CPP/Windows/Clipboard.h b/CPP/Windows/Clipboard.h
index 60fedc1..3b4f2fe 100644
--- a/CPP/Windows/Clipboard.h
+++ b/CPP/Windows/Clipboard.h
@@ -1,7 +1,7 @@
1// Windows/Clipboard.h 1// Windows/Clipboard.h
2 2
3#ifndef __CLIPBOARD_H 3#ifndef ZIP7_INC_CLIPBOARD_H
4#define __CLIPBOARD_H 4#define ZIP7_INC_CLIPBOARD_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7 7
@@ -11,7 +11,7 @@ class CClipboard
11{ 11{
12 bool m_Open; 12 bool m_Open;
13public: 13public:
14 CClipboard(): m_Open(false) {}; 14 CClipboard(): m_Open(false) {}
15 ~CClipboard() { Close(); } 15 ~CClipboard() { Close(); }
16 bool Open(HWND wndNewOwner) throw(); 16 bool Open(HWND wndNewOwner) throw();
17 bool Close() throw(); 17 bool Close() throw();
diff --git a/CPP/Windows/CommonDialog.cpp b/CPP/Windows/CommonDialog.cpp
index eaaecad..7a92d5f 100644
--- a/CPP/Windows/CommonDialog.cpp
+++ b/CPP/Windows/CommonDialog.cpp
@@ -2,7 +2,7 @@
2 2
3#include "StdAfx.h" 3#include "StdAfx.h"
4 4
5#include "../Common/MyWindows.h" 5#include "../Common/MyBuffer.h"
6 6
7#ifdef UNDER_CE 7#ifdef UNDER_CE
8#include <commdlg.h> 8#include <commdlg.h>
@@ -14,6 +14,7 @@
14 14
15#include "CommonDialog.h" 15#include "CommonDialog.h"
16#include "Defs.h" 16#include "Defs.h"
17// #include "FileDir.h"
17 18
18#ifndef _UNICODE 19#ifndef _UNICODE
19extern bool g_IsNT; 20extern bool g_IsNT;
@@ -21,61 +22,46 @@ extern bool g_IsNT;
21 22
22namespace NWindows { 23namespace NWindows {
23 24
24#ifndef _UNICODE 25/*
26 GetSaveFileName()
27 GetOpenFileName()
28 OPENFILENAME
25 29
26class CDoubleZeroStringListA 30(lpstrInitialDir) : the initial directory.
27{ 31DOCs: the algorithm for selecting the initial directory varies on different platforms:
28 LPTSTR Buf;
29 unsigned Size;
30public:
31 CDoubleZeroStringListA(LPSTR buf, unsigned size): Buf(buf), Size(size) {}
32 bool Add(LPCSTR s) throw();
33 void Finish() { *Buf = 0; }
34};
35
36bool CDoubleZeroStringListA::Add(LPCSTR s) throw()
37{ 32{
38 unsigned len = MyStringLen(s) + 1; 33 Win2000/XP/Vista:
39 if (len >= Size) 34 1. If lpstrFile contains a path, that path is the initial directory.
40 return false; 35 2. Otherwise, lpstrInitialDir specifies the initial directory.
41 MyStringCopy(Buf, s); 36
42 Buf += len; 37 Win7:
43 Size -= len; 38 If lpstrInitialDir has the same value as was passed the first time
44 return true; 39 the application used an Open or Save As dialog box, the path
40 most recently selected by the user is used as the initial directory.
45} 41}
46 42
47#endif 43Win10:
44 in:
45 function supports (lpstrInitialDir) path with super prefix "\\\\?\\"
46 function supports (lpstrInitialDir) path with long path
47 function doesn't support absolute (lpstrFile) path with super prefix "\\\\?\\"
48 function doesn't support absolute (lpstrFile) path with long path
49 out: the path with super prefix "\\\\?\\" will be returned, if selected path is long
48 50
49class CDoubleZeroStringListW 51WinXP-64 and Win10: if no filters, the system shows all files.
50{ 52 but DOCs say: If all three members are zero or NULL,
51 LPWSTR Buf; 53 the system does not use any filters and does not
52 unsigned Size; 54 show any files in the file list control of the dialog box.
53public:
54 CDoubleZeroStringListW(LPWSTR buf, unsigned size): Buf(buf), Size(size) {}
55 bool Add(LPCWSTR s) throw();
56 void Finish() { *Buf = 0; }
57};
58
59bool CDoubleZeroStringListW::Add(LPCWSTR s) throw()
60{
61 unsigned len = MyStringLen(s) + 1;
62 if (len >= Size)
63 return false;
64 MyStringCopy(Buf, s);
65 Buf += len;
66 Size -= len;
67 return true;
68}
69 55
56in Win7+: GetOpenFileName() and GetSaveFileName()
57 do not support pstrCustomFilter feature anymore
58*/
70 59
71#ifdef UNDER_CE 60#ifdef UNDER_CE
72#define MY__OFN_PROJECT 0x00400000 61#define MY_OFN_PROJECT 0x00400000
73#define MY__OFN_SHOW_ALL 0x01000000 62#define MY_OFN_SHOW_ALL 0x01000000
74#endif 63#endif
75 64
76/* if (lpstrFilter == NULL && nFilterIndex == 0)
77 MSDN : "the system doesn't show any files",
78 but WinXP-64 shows all files. Why ??? */
79 65
80/* 66/*
81structures 67structures
@@ -89,16 +75,16 @@ contain additional members:
89#endif 75#endif
90 76
91If we compile the source code with (_WIN32_WINNT >= 0x0500), some functions 77If we compile the source code with (_WIN32_WINNT >= 0x0500), some functions
92will not work at NT 4.0, if we use sizeof(OPENFILENAME*). 78will not work at NT 4.0, if we use sizeof(OPENFILENAME).
93So we use size of old version of structure. */ 79We try to use reduced structure OPENFILENAME_NT4.
80*/
94 81
95#if defined(UNDER_CE) || defined(_WIN64) || (_WIN32_WINNT < 0x0500) 82// #if defined(_WIN64) || (defined(_WIN32_WINNT) && _WIN32_WINNT >= 0x0500)
96// || !defined(WINVER) 83#if defined(__GNUC__) && (__GNUC__ <= 9) || defined(Z7_OLD_WIN_SDK)
97 #ifndef _UNICODE 84 #ifndef _UNICODE
98 #define my_compatib_OPENFILENAMEA_size sizeof(OPENFILENAMEA) 85 #define my_compatib_OPENFILENAMEA OPENFILENAMEA
99 #endif 86 #endif
100 #define my_compatib_OPENFILENAMEW_size sizeof(OPENFILENAMEW) 87 #define my_compatib_OPENFILENAMEW OPENFILENAMEW
101#else
102 88
103 // MinGW doesn't support some required macros. So we define them here: 89 // MinGW doesn't support some required macros. So we define them here:
104 #ifndef CDSIZEOF_STRUCT 90 #ifndef CDSIZEOF_STRUCT
@@ -117,91 +103,166 @@ So we use size of old version of structure. */
117 #define my_compatib_OPENFILENAMEA_size OPENFILENAME_SIZE_VERSION_400A 103 #define my_compatib_OPENFILENAMEA_size OPENFILENAME_SIZE_VERSION_400A
118 #endif 104 #endif
119 #define my_compatib_OPENFILENAMEW_size OPENFILENAME_SIZE_VERSION_400W 105 #define my_compatib_OPENFILENAMEW_size OPENFILENAME_SIZE_VERSION_400W
106#else
107 #ifndef _UNICODE
108 #define my_compatib_OPENFILENAMEA OPENFILENAME_NT4A
109 #define my_compatib_OPENFILENAMEA_size sizeof(my_compatib_OPENFILENAMEA)
110 #endif
111 #define my_compatib_OPENFILENAMEW OPENFILENAME_NT4W
112 #define my_compatib_OPENFILENAMEW_size sizeof(my_compatib_OPENFILENAMEW)
113#endif
114/*
115#elif defined(UNDER_CE) || defined(_WIN64) || (_WIN32_WINNT < 0x0500)
116// || !defined(WINVER)
117 #ifndef _UNICODE
118 #define my_compatib_OPENFILENAMEA OPENFILENAMEA
119 #define my_compatib_OPENFILENAMEA_size sizeof(OPENFILENAMEA)
120 #endif
121 #define my_compatib_OPENFILENAMEW OPENFILENAMEW
122 #define my_compatib_OPENFILENAMEW_size sizeof(OPENFILENAMEW)
123#else
124
120#endif 125#endif
126*/
121 127
122#ifndef _UNICODE 128#ifndef _UNICODE
123#define CONV_U_To_A(dest, src, temp) AString temp; if (src) { temp = GetSystemString(src); dest = temp; } 129#define CONV_U_To_A(dest, src, temp) AString temp; if (src) { temp = GetSystemString(src); dest = temp; }
124#endif 130#endif
125 131
126bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, 132bool CCommonDialogInfo::CommonDlg_BrowseForFile(LPCWSTR lpstrInitialDir, const UStringVector &filters)
127 LPCWSTR initialDir,
128 LPCWSTR filePath,
129 LPCWSTR filterDescription,
130 LPCWSTR filter,
131 UString &resPath
132 #ifdef UNDER_CE
133 , bool openFolder
134 #endif
135 )
136{ 133{
137 const unsigned kBufSize = MAX_PATH * 2; 134 /* GetSaveFileName() and GetOpenFileName() could change current dir,
138 const unsigned kFilterBufSize = MAX_PATH; 135 if OFN_NOCHANGEDIR is not used.
139 if (!filter) 136 We can restore current dir manually, if it's required.
140 filter = L"*.*"; 137 22.02: we use OFN_NOCHANGEDIR. So we don't need to restore current dir manually. */
141 #ifndef _UNICODE 138 // NFile::NDir::CCurrentDirRestorer curDirRestorer;
139
140#ifndef _UNICODE
142 if (!g_IsNT) 141 if (!g_IsNT)
143 { 142 {
144 CHAR buf[kBufSize]; 143 AString tempPath;
145 MyStringCopy(buf, (const char *)GetSystemString(filePath)); 144 AStringVector f;
146 // OPENFILENAME_NT4A 145 unsigned i;
147 OPENFILENAMEA p; 146 for (i = 0; i < filters.Size(); i++)
147 f.Add(GetSystemString(filters[i]));
148 unsigned size = f.Size() + 1;
149 for (i = 0; i < f.Size(); i++)
150 size += f[i].Len();
151 CObjArray<char> filterBuf(size);
152 // memset(filterBuf, 0, size * sizeof(char));
153 {
154 char *dest = filterBuf;
155 for (i = 0; i < f.Size(); i++)
156 {
157 const AString &s = f[i];
158 MyStringCopy(dest, s);
159 dest += s.Len() + 1;
160 }
161 *dest = 0;
162 }
163 my_compatib_OPENFILENAMEA p;
148 memset(&p, 0, sizeof(p)); 164 memset(&p, 0, sizeof(p));
149 p.lStructSize = my_compatib_OPENFILENAMEA_size; 165 p.lStructSize = my_compatib_OPENFILENAMEA_size;
150 p.hwndOwner = hwnd; 166 p.hwndOwner = hwndOwner;
151 CHAR filterBuf[kFilterBufSize]; 167 if (size > 1)
152 { 168 {
153 CDoubleZeroStringListA dz(filterBuf, kFilterBufSize);
154 dz.Add(GetSystemString(filterDescription ? filterDescription : filter));
155 dz.Add(GetSystemString(filter));
156 dz.Finish();
157 p.lpstrFilter = filterBuf; 169 p.lpstrFilter = filterBuf;
158 p.nFilterIndex = 1; 170 p.nFilterIndex = (DWORD)(FilterIndex + 1);
171 }
172
173 CONV_U_To_A(p.lpstrInitialDir, lpstrInitialDir, initialDir_a)
174 CONV_U_To_A(p.lpstrTitle, lpstrTitle, title_a)
175
176 const AString filePath_a = GetSystemString(FilePath);
177 const unsigned bufSize = MAX_PATH * 8
178 + filePath_a.Len()
179 + initialDir_a.Len();
180 p.nMaxFile = bufSize;
181 p.lpstrFile = tempPath.GetBuf(bufSize);
182 MyStringCopy(p.lpstrFile, filePath_a);
183 p.Flags =
184 OFN_EXPLORER
185 | OFN_HIDEREADONLY
186 | OFN_NOCHANGEDIR;
187 const BOOL b = SaveMode ?
188 ::GetSaveFileNameA((LPOPENFILENAMEA)(void *)&p) :
189 ::GetOpenFileNameA((LPOPENFILENAMEA)(void *)&p);
190 if (!b)
191 return false;
192 {
193 tempPath.ReleaseBuf_CalcLen(bufSize);
194 FilePath = GetUnicodeString(tempPath);
195 FilterIndex = (int)p.nFilterIndex - 1;
196 return true;
159 } 197 }
160
161 p.lpstrFile = buf;
162 p.nMaxFile = kBufSize;
163 CONV_U_To_A(p.lpstrInitialDir, initialDir, initialDirA);
164 CONV_U_To_A(p.lpstrTitle, title, titleA);
165 p.Flags = OFN_EXPLORER | OFN_HIDEREADONLY;
166
167 bool res = BOOLToBool(::GetOpenFileNameA(&p));
168 resPath = GetUnicodeString(buf);
169 return res;
170 } 198 }
171 else 199 else
172 #endif 200#endif
173 { 201 {
174 WCHAR buf[kBufSize]; 202 UString tempPath;
175 MyStringCopy(buf, filePath); 203 unsigned size = filters.Size() + 1;
176 // OPENFILENAME_NT4W 204 unsigned i;
177 OPENFILENAMEW p; 205 for (i = 0; i < filters.Size(); i++)
206 size += filters[i].Len();
207 CObjArray<wchar_t> filterBuf(size);
208 // memset(filterBuf, 0, size * sizeof(wchar_t));
209 {
210 wchar_t *dest = filterBuf;
211 for (i = 0; i < filters.Size(); i++)
212 {
213 const UString &s = filters[i];
214 MyStringCopy(dest, s);
215 dest += s.Len() + 1;
216 }
217 *dest = 0;
218 // if ((unsigned)(dest + 1 - filterBuf) != size) return false;
219 }
220 my_compatib_OPENFILENAMEW p;
178 memset(&p, 0, sizeof(p)); 221 memset(&p, 0, sizeof(p));
179 p.lStructSize = my_compatib_OPENFILENAMEW_size; 222 p.lStructSize = my_compatib_OPENFILENAMEW_size;
180 p.hwndOwner = hwnd; 223 p.hwndOwner = hwndOwner;
181 224 if (size > 1)
182 WCHAR filterBuf[kFilterBufSize];
183 { 225 {
184 CDoubleZeroStringListW dz(filterBuf, kFilterBufSize);
185 dz.Add(filterDescription ? filterDescription : filter);
186 dz.Add(filter);
187 dz.Finish();
188 p.lpstrFilter = filterBuf; 226 p.lpstrFilter = filterBuf;
189 p.nFilterIndex = 1; 227 p.nFilterIndex = (DWORD)(FilterIndex + 1);
190 } 228 }
191 229 unsigned bufSize = MAX_PATH * 8 + FilePath.Len();
192 p.lpstrFile = buf; 230 if (lpstrInitialDir)
193 p.nMaxFile = kBufSize; 231 {
194 p.lpstrInitialDir = initialDir; 232 p.lpstrInitialDir = lpstrInitialDir;
195 p.lpstrTitle = title; 233 bufSize += MyStringLen(lpstrInitialDir);
196 p.Flags = OFN_EXPLORER | OFN_HIDEREADONLY 234 }
197 #ifdef UNDER_CE 235 p.nMaxFile = bufSize;
198 | (openFolder ? (MY__OFN_PROJECT | MY__OFN_SHOW_ALL) : 0) 236 p.lpstrFile = tempPath.GetBuf(bufSize);
199 #endif 237 MyStringCopy(p.lpstrFile, FilePath);
238 p.lpstrTitle = lpstrTitle;
239 p.Flags =
240 OFN_EXPLORER
241 | OFN_HIDEREADONLY
242 | OFN_NOCHANGEDIR
243 // | OFN_FORCESHOWHIDDEN // Win10 shows hidden items even without this flag
244 // | OFN_PATHMUSTEXIST
245 #ifdef UNDER_CE
246 | (OpenFolderMode ? (MY_OFN_PROJECT | MY_OFN_SHOW_ALL) : 0)
247 #endif
200 ; 248 ;
201 249 const BOOL b = SaveMode ?
202 bool res = BOOLToBool(::GetOpenFileNameW(&p)); 250 ::GetSaveFileNameW((LPOPENFILENAMEW)(void *)&p) :
203 resPath = buf; 251 ::GetOpenFileNameW((LPOPENFILENAMEW)(void *)&p);
204 return res; 252 /* DOCs: lpstrFile :
253 if the buffer is too small, then:
254 - the function returns FALSE
255 - the CommDlgExtendedError() returns FNERR_BUFFERTOOSMALL
256 - the first two bytes of the lpstrFile buffer contain the
257 required size, in bytes or characters. */
258 if (!b)
259 return false;
260 {
261 tempPath.ReleaseBuf_CalcLen(bufSize);
262 FilePath = tempPath;
263 FilterIndex = (int)p.nFilterIndex - 1;
264 return true;
265 }
205 } 266 }
206} 267}
207 268
diff --git a/CPP/Windows/CommonDialog.h b/CPP/Windows/CommonDialog.h
index aaf17ac..85b071f 100644
--- a/CPP/Windows/CommonDialog.h
+++ b/CPP/Windows/CommonDialog.h
@@ -1,22 +1,42 @@
1// Windows/CommonDialog.h 1// Windows/CommonDialog.h
2 2
3#ifndef __WINDOWS_COMMON_DIALOG_H 3#ifndef ZIP7_INC_WINDOWS_COMMON_DIALOG_H
4#define __WINDOWS_COMMON_DIALOG_H 4#define ZIP7_INC_WINDOWS_COMMON_DIALOG_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7 7
8namespace NWindows { 8namespace NWindows {
9 9
10bool MyGetOpenFileName(HWND hwnd, LPCWSTR title, 10struct CCommonDialogInfo
11 LPCWSTR initialDir, // can be NULL, so dir prefix in filePath will be used 11{
12 LPCWSTR filePath, // full path 12 /* (FilterIndex == -1) means no selected filter.
13 LPCWSTR filterDescription, // like "All files (*.*)" 13 and (-1) also is reserved for unsupported custom filter.
14 LPCWSTR filter, // like "*.exe" 14 if (FilterIndex >= 0), then FilterIndex is index of filter */
15 UString &resPath 15 int FilterIndex; // [in / out]
16 #ifdef UNDER_CE 16 bool SaveMode;
17 , bool openFolder = false 17 #ifdef UNDER_CE
18 #endif 18 bool OpenFolderMode;
19); 19 #endif
20 HWND hwndOwner;
21 // LPCWSTR lpstrInitialDir;
22 LPCWSTR lpstrTitle;
23 UString FilePath; // [in / out]
24
25 CCommonDialogInfo()
26 {
27 FilterIndex = -1;
28 SaveMode = false;
29 #ifdef UNDER_CE
30 OpenFolderMode = false;
31 #endif
32 hwndOwner = NULL;
33 // lpstrInitialDir = NULL;
34 lpstrTitle = NULL;
35 }
36
37 /* (filters) : 2 sequential vector strings (Description, Masks) represent each filter */
38 bool CommonDlg_BrowseForFile(LPCWSTR lpstrInitialDir, const UStringVector &filters);
39};
20 40
21} 41}
22 42
diff --git a/CPP/Windows/Console.h b/CPP/Windows/Console.h
index 43e02fa..818b8d4 100644
--- a/CPP/Windows/Console.h
+++ b/CPP/Windows/Console.h
@@ -1,7 +1,7 @@
1// Windows/Console.h 1// Windows/Console.h
2 2
3#ifndef __WINDOWS_CONSOLE_H 3#ifndef ZIP7_INC_WINDOWS_CONSOLE_H
4#define __WINDOWS_CONSOLE_H 4#define ZIP7_INC_WINDOWS_CONSOLE_H
5 5
6#include "Defs.h" 6#include "Defs.h"
7 7
diff --git a/CPP/Windows/Control/ComboBox.cpp b/CPP/Windows/Control/ComboBox.cpp
index f6ed8d3..8da487d 100644
--- a/CPP/Windows/Control/ComboBox.cpp
+++ b/CPP/Windows/Control/ComboBox.cpp
@@ -43,10 +43,10 @@ LRESULT CComboBox::GetLBText(int index, UString &s)
43 s.Empty(); 43 s.Empty();
44 if (g_IsNT) 44 if (g_IsNT)
45 { 45 {
46 LRESULT len = SendMsgW(CB_GETLBTEXTLEN, MY__int_TO_WPARAM(index), 0); 46 LRESULT len = SendMsgW(CB_GETLBTEXTLEN, MY_int_TO_WPARAM(index), 0);
47 if (len == CB_ERR) 47 if (len == CB_ERR)
48 return len; 48 return len;
49 LRESULT len2 = SendMsgW(CB_GETLBTEXT, MY__int_TO_WPARAM(index), (LPARAM)s.GetBuf((unsigned)len)); 49 LRESULT len2 = SendMsgW(CB_GETLBTEXT, MY_int_TO_WPARAM(index), (LPARAM)s.GetBuf((unsigned)len));
50 if (len2 == CB_ERR) 50 if (len2 == CB_ERR)
51 return len; 51 return len;
52 if (len > len2) 52 if (len > len2)
@@ -55,11 +55,11 @@ LRESULT CComboBox::GetLBText(int index, UString &s)
55 return len; 55 return len;
56 } 56 }
57 AString sa; 57 AString sa;
58 LRESULT len = GetLBText(index, sa); 58 const LRESULT len = GetLBText(index, sa);
59 if (len == CB_ERR) 59 if (len == CB_ERR)
60 return len; 60 return len;
61 s = GetUnicodeString(sa); 61 s = GetUnicodeString(sa);
62 return s.Len(); 62 return (LRESULT)s.Len();
63} 63}
64#endif 64#endif
65 65
diff --git a/CPP/Windows/Control/ComboBox.h b/CPP/Windows/Control/ComboBox.h
index f08b1f7..2a60b8a 100644
--- a/CPP/Windows/Control/ComboBox.h
+++ b/CPP/Windows/Control/ComboBox.h
@@ -1,7 +1,7 @@
1// Windows/Control/ComboBox.h 1// Windows/Control/ComboBox.h
2 2
3#ifndef __WINDOWS_CONTROL_COMBOBOX_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_COMBOBOX_H
4#define __WINDOWS_CONTROL_COMBOBOX_H 4#define ZIP7_INC_WINDOWS_CONTROL_COMBOBOX_H
5 5
6#include "../../Common/MyWindows.h" 6#include "../../Common/MyWindows.h"
7 7
@@ -12,8 +12,6 @@
12namespace NWindows { 12namespace NWindows {
13namespace NControl { 13namespace NControl {
14 14
15#define MY__int_TO_WPARAM(i) ((WPARAM)(INT_PTR)(i))
16
17class CComboBox: public CWindow 15class CComboBox: public CWindow
18{ 16{
19public: 17public:
@@ -24,7 +22,8 @@ public:
24 #endif 22 #endif
25 23
26 /* If this parameter is -1, any current selection in the list is removed and the edit control is cleared.*/ 24 /* If this parameter is -1, any current selection in the list is removed and the edit control is cleared.*/
27 LRESULT SetCurSel(int index) { return SendMsg(CB_SETCURSEL, MY__int_TO_WPARAM(index), 0); } 25 LRESULT SetCurSel(int index) { return SendMsg(CB_SETCURSEL, MY_int_TO_WPARAM(index), 0); }
26 LRESULT SetCurSel(unsigned index) { return SendMsg(CB_SETCURSEL, index, 0); }
28 27
29 /* If no item is selected, it returns CB_ERR (-1) */ 28 /* If no item is selected, it returns CB_ERR (-1) */
30 int GetCurSel() { return (int)SendMsg(CB_GETCURSEL, 0, 0); } 29 int GetCurSel() { return (int)SendMsg(CB_GETCURSEL, 0, 0); }
@@ -32,15 +31,16 @@ public:
32 /* If an error occurs, it is CB_ERR (-1) */ 31 /* If an error occurs, it is CB_ERR (-1) */
33 int GetCount() { return (int)SendMsg(CB_GETCOUNT, 0, 0); } 32 int GetCount() { return (int)SendMsg(CB_GETCOUNT, 0, 0); }
34 33
35 LRESULT GetLBTextLen(int index) { return SendMsg(CB_GETLBTEXTLEN, MY__int_TO_WPARAM(index), 0); } 34 LRESULT GetLBTextLen(int index) { return SendMsg(CB_GETLBTEXTLEN, MY_int_TO_WPARAM(index), 0); }
36 LRESULT GetLBText(int index, LPTSTR s) { return SendMsg(CB_GETLBTEXT, MY__int_TO_WPARAM(index), (LPARAM)s); } 35 LRESULT GetLBText(int index, LPTSTR s) { return SendMsg(CB_GETLBTEXT, MY_int_TO_WPARAM(index), (LPARAM)s); }
37 LRESULT GetLBText(int index, CSysString &s); 36 LRESULT GetLBText(int index, CSysString &s);
38 #ifndef _UNICODE 37 #ifndef _UNICODE
39 LRESULT GetLBText(int index, UString &s); 38 LRESULT GetLBText(int index, UString &s);
40 #endif 39 #endif
41 40
42 LRESULT SetItemData(int index, LPARAM lParam) { return SendMsg(CB_SETITEMDATA, MY__int_TO_WPARAM(index), lParam); } 41 LRESULT SetItemData(int index, LPARAM lParam) { return SendMsg(CB_SETITEMDATA, MY_int_TO_WPARAM(index), lParam); }
43 LRESULT GetItemData(int index) { return SendMsg(CB_GETITEMDATA, MY__int_TO_WPARAM(index), 0); } 42 LRESULT GetItemData(int index) { return SendMsg(CB_GETITEMDATA, MY_int_TO_WPARAM(index), 0); }
43 LRESULT GetItemData(unsigned index) { return SendMsg(CB_GETITEMDATA, index, 0); }
44 44
45 LRESULT GetItemData_of_CurSel() { return GetItemData(GetCurSel()); } 45 LRESULT GetItemData_of_CurSel() { return GetItemData(GetCurSel()); }
46 46
@@ -57,7 +57,7 @@ public:
57 /* Returns: 57 /* Returns:
58 an INT value that represents the number of items remaining in the control. 58 an INT value that represents the number of items remaining in the control.
59 If (index) is invalid, the message returns CB_ERR. */ 59 If (index) is invalid, the message returns CB_ERR. */
60 LRESULT DeleteItem(int index) { return SendMsg(CBEM_DELETEITEM, MY__int_TO_WPARAM(index), 0); } 60 LRESULT DeleteItem(int index) { return SendMsg(CBEM_DELETEITEM, MY_int_TO_WPARAM(index), 0); }
61 61
62 LRESULT InsertItem(COMBOBOXEXITEM *item) { return SendMsg(CBEM_INSERTITEM, 0, (LPARAM)item); } 62 LRESULT InsertItem(COMBOBOXEXITEM *item) { return SendMsg(CBEM_INSERTITEM, 0, (LPARAM)item); }
63 #ifndef _UNICODE 63 #ifndef _UNICODE
@@ -65,7 +65,7 @@ public:
65 #endif 65 #endif
66 66
67 LRESULT SetItem(COMBOBOXEXITEM *item) { return SendMsg(CBEM_SETITEM, 0, (LPARAM)item); } 67 LRESULT SetItem(COMBOBOXEXITEM *item) { return SendMsg(CBEM_SETITEM, 0, (LPARAM)item); }
68 DWORD SetExtendedStyle(DWORD exMask, DWORD exStyle) { return (DWORD)SendMsg(CBEM_SETEXTENDEDSTYLE, exMask, exStyle); } 68 DWORD SetExtendedStyle(DWORD exMask, DWORD exStyle) { return (DWORD)SendMsg(CBEM_SETEXTENDEDSTYLE, exMask, (LPARAM)exStyle); }
69 HWND GetEditControl() { return (HWND)SendMsg(CBEM_GETEDITCONTROL, 0, 0); } 69 HWND GetEditControl() { return (HWND)SendMsg(CBEM_GETEDITCONTROL, 0, 0); }
70 HIMAGELIST SetImageList(HIMAGELIST imageList) { return (HIMAGELIST)SendMsg(CBEM_SETIMAGELIST, 0, (LPARAM)imageList); } 70 HIMAGELIST SetImageList(HIMAGELIST imageList) { return (HIMAGELIST)SendMsg(CBEM_SETIMAGELIST, 0, (LPARAM)imageList); }
71}; 71};
diff --git a/CPP/Windows/Control/CommandBar.h b/CPP/Windows/Control/CommandBar.h
index a619744..d1b2f17 100644
--- a/CPP/Windows/Control/CommandBar.h
+++ b/CPP/Windows/Control/CommandBar.h
@@ -1,7 +1,7 @@
1// Windows/Control/CommandBar.h 1// Windows/Control/CommandBar.h
2 2
3#ifndef __WINDOWS_CONTROL_COMMANDBAR_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_COMMANDBAR_H
4#define __WINDOWS_CONTROL_COMMANDBAR_H 4#define ZIP7_INC_WINDOWS_CONTROL_COMMANDBAR_H
5 5
6#ifdef UNDER_CE 6#ifdef UNDER_CE
7 7
@@ -26,12 +26,12 @@ public:
26 // Macros 26 // Macros
27 // void Destroy() { CommandBar_Destroy(_window); } 27 // void Destroy() { CommandBar_Destroy(_window); }
28 // bool AddButtons(UINT numButtons, LPTBBUTTON buttons) { return BOOLToBool(SendMsg(TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)buttons)); } 28 // bool AddButtons(UINT numButtons, LPTBBUTTON buttons) { return BOOLToBool(SendMsg(TB_ADDBUTTONS, (WPARAM)numButtons, (LPARAM)buttons)); }
29 bool InsertButton(int iButton, LPTBBUTTON button) { return BOOLToBool(SendMsg(TB_INSERTBUTTON, (WPARAM)iButton, (LPARAM)button)); } 29 // bool InsertButton(unsigned iButton, LPTBBUTTON button) { return BOOLToBool(SendMsg(TB_INSERTBUTTON, (WPARAM)iButton, (LPARAM)button)); }
30 BOOL AddToolTips(UINT numToolTips, LPTSTR toolTips) { return BOOLToBool(SendMsg(TB_SETTOOLTIPS, (WPARAM)numToolTips, (LPARAM)toolTips)); } 30 // BOOL AddToolTips(UINT numToolTips, LPTSTR toolTips) { return BOOLToBool(SendMsg(TB_SETTOOLTIPS, (WPARAM)numToolTips, (LPARAM)toolTips)); }
31 void AutoSize() { SendMsg(TB_AUTOSIZE, 0, 0); } 31 void AutoSize() { SendMsg(TB_AUTOSIZE, 0, 0); }
32 32
33 bool AddAdornments(DWORD dwFlags) { return BOOLToBool(::CommandBar_AddAdornments(_window, dwFlags, 0)); } 33 // bool AddAdornments(DWORD dwFlags) { return BOOLToBool(::CommandBar_AddAdornments(_window, dwFlags, 0)); }
34 int AddBitmap(HINSTANCE hInst, int idBitmap, int iNumImages, int iImageWidth, int iImageHeight) { return ::CommandBar_AddBitmap(_window, hInst, idBitmap, iNumImages, iImageWidth, iImageHeight); } 34 // int AddBitmap(HINSTANCE hInst, int idBitmap, int iNumImages, int iImageWidth, int iImageHeight) { return ::CommandBar_AddBitmap(_window, hInst, idBitmap, iNumImages, iImageWidth, iImageHeight); }
35 bool DrawMenuBar(WORD iButton) { return BOOLToBool(::CommandBar_DrawMenuBar(_window, iButton)); } 35 bool DrawMenuBar(WORD iButton) { return BOOLToBool(::CommandBar_DrawMenuBar(_window, iButton)); }
36 HMENU GetMenu(WORD iButton) { return ::CommandBar_GetMenu(_window, iButton); } 36 HMENU GetMenu(WORD iButton) { return ::CommandBar_GetMenu(_window, iButton); }
37 int Height() { return CommandBar_Height(_window); } 37 int Height() { return CommandBar_Height(_window); }
diff --git a/CPP/Windows/Control/Dialog.cpp b/CPP/Windows/Control/Dialog.cpp
index 9ddd234..c8f1bd2 100644
--- a/CPP/Windows/Control/Dialog.cpp
+++ b/CPP/Windows/Control/Dialog.cpp
@@ -18,7 +18,14 @@ extern bool g_IsNT;
18namespace NWindows { 18namespace NWindows {
19namespace NControl { 19namespace NControl {
20 20
21static INT_PTR APIENTRY DialogProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam) 21static
22#ifdef Z7_OLD_WIN_SDK
23 BOOL
24#else
25 INT_PTR
26#endif
27APIENTRY
28DialogProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam)
22{ 29{
23 CWindow tempDialog(dialogHWND); 30 CWindow tempDialog(dialogHWND);
24 if (message == WM_INITDIALOG) 31 if (message == WM_INITDIALOG)
@@ -45,7 +52,7 @@ bool CDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
45 switch (message) 52 switch (message)
46 { 53 {
47 case WM_INITDIALOG: return OnInit(); 54 case WM_INITDIALOG: return OnInit();
48 case WM_COMMAND: return OnCommand(wParam, lParam); 55 case WM_COMMAND: return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam);
49 case WM_NOTIFY: return OnNotify((UINT)wParam, (LPNMHDR) lParam); 56 case WM_NOTIFY: return OnNotify((UINT)wParam, (LPNMHDR) lParam);
50 case WM_TIMER: return OnTimer(wParam, lParam); 57 case WM_TIMER: return OnTimer(wParam, lParam);
51 case WM_SIZE: return OnSize(wParam, LOWORD(lParam), HIWORD(lParam)); 58 case WM_SIZE: return OnSize(wParam, LOWORD(lParam), HIWORD(lParam));
@@ -65,19 +72,21 @@ bool CDialog::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
65 } 72 }
66} 73}
67 74
68bool CDialog::OnCommand(WPARAM wParam, LPARAM lParam) 75/*
76bool CDialog::OnCommand2(WPARAM wParam, LPARAM lParam)
69{ 77{
70 return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam); 78 return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam);
71} 79}
80*/
72 81
73bool CDialog::OnCommand(int code, int itemID, LPARAM lParam) 82bool CDialog::OnCommand(unsigned code, unsigned itemID, LPARAM lParam)
74{ 83{
75 if (code == BN_CLICKED) 84 if (code == BN_CLICKED)
76 return OnButtonClicked(itemID, (HWND)lParam); 85 return OnButtonClicked(itemID, (HWND)lParam);
77 return false; 86 return false;
78} 87}
79 88
80bool CDialog::OnButtonClicked(int buttonID, HWND /* buttonHWND */) 89bool CDialog::OnButtonClicked(unsigned buttonID, HWND /* buttonHWND */)
81{ 90{
82 switch (buttonID) 91 switch (buttonID)
83 { 92 {
@@ -90,6 +99,28 @@ bool CDialog::OnButtonClicked(int buttonID, HWND /* buttonHWND */)
90 return true; 99 return true;
91} 100}
92 101
102#ifndef UNDER_CE
103/* in win2000/win98 : monitor functions are supported.
104 We need dynamic linking, if we want nt4/win95 support in program.
105 Even if we compile the code with low (WINVER) value, we still
106 want to use monitor functions. So we declare missing functions here */
107// #if (WINVER < 0x0500)
108#ifndef MONITOR_DEFAULTTOPRIMARY
109extern "C" {
110DECLARE_HANDLE(HMONITOR);
111#define MONITOR_DEFAULTTOPRIMARY 0x00000001
112typedef struct tagMONITORINFO
113{
114 DWORD cbSize;
115 RECT rcMonitor;
116 RECT rcWork;
117 DWORD dwFlags;
118} MONITORINFO, *LPMONITORINFO;
119WINUSERAPI HMONITOR WINAPI MonitorFromWindow(HWND hwnd, DWORD dwFlags);
120WINUSERAPI BOOL WINAPI GetMonitorInfoA(HMONITOR hMonitor, LPMONITORINFO lpmi);
121}
122#endif
123#endif
93 124
94static bool GetWorkAreaRect(RECT *rect, HWND hwnd) 125static bool GetWorkAreaRect(RECT *rect, HWND hwnd)
95{ 126{
@@ -172,7 +203,7 @@ int CDialog::Units_To_Pixels_X(int units)
172 return rect.right - rect.left; 203 return rect.right - rect.left;
173} 204}
174 205
175bool CDialog::GetItemSizes(int id, int &x, int &y) 206bool CDialog::GetItemSizes(unsigned id, int &x, int &y)
176{ 207{
177 RECT rect; 208 RECT rect;
178 if (!::GetWindowRect(GetItem(id), &rect)) 209 if (!::GetWindowRect(GetItem(id), &rect))
@@ -182,13 +213,13 @@ bool CDialog::GetItemSizes(int id, int &x, int &y)
182 return true; 213 return true;
183} 214}
184 215
185void CDialog::GetClientRectOfItem(int id, RECT &rect) 216void CDialog::GetClientRectOfItem(unsigned id, RECT &rect)
186{ 217{
187 ::GetWindowRect(GetItem(id), &rect); 218 ::GetWindowRect(GetItem(id), &rect);
188 ScreenToClient(&rect); 219 ScreenToClient(&rect);
189} 220}
190 221
191bool CDialog::MoveItem(int id, int x, int y, int width, int height, bool repaint) 222bool CDialog::MoveItem(unsigned id, int x, int y, int width, int height, bool repaint)
192{ 223{
193 return BOOLToBool(::MoveWindow(GetItem(id), x, y, width, height, BoolToBOOL(repaint))); 224 return BOOLToBool(::MoveWindow(GetItem(id), x, y, width, height, BoolToBOOL(repaint)));
194} 225}
@@ -356,8 +387,8 @@ void CDialog::NormalizePosition()
356 387
357bool CModelessDialog::Create(LPCTSTR templateName, HWND parentWindow) 388bool CModelessDialog::Create(LPCTSTR templateName, HWND parentWindow)
358{ 389{
359 HWND aHWND = CreateDialogParam(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this); 390 const HWND aHWND = CreateDialogParam(g_hInstance, templateName, parentWindow, DialogProcedure, (LPARAM)this);
360 if (aHWND == 0) 391 if (!aHWND)
361 return false; 392 return false;
362 Attach(aHWND); 393 Attach(aHWND);
363 return true; 394 return true;
diff --git a/CPP/Windows/Control/Dialog.h b/CPP/Windows/Control/Dialog.h
index 8a39e99..06be4bf 100644
--- a/CPP/Windows/Control/Dialog.h
+++ b/CPP/Windows/Control/Dialog.h
@@ -1,7 +1,7 @@
1// Windows/Control/Dialog.h 1// Windows/Control/Dialog.h
2 2
3#ifndef __WINDOWS_CONTROL_DIALOG_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_DIALOG_H
4#define __WINDOWS_CONTROL_DIALOG_H 4#define ZIP7_INC_WINDOWS_CONTROL_DIALOG_H
5 5
6#include "../Window.h" 6#include "../Window.h"
7 7
@@ -10,65 +10,66 @@ namespace NControl {
10 10
11class CDialog: public CWindow 11class CDialog: public CWindow
12{ 12{
13 // Z7_CLASS_NO_COPY(CDialog)
13public: 14public:
14 CDialog(HWND wnd = NULL): CWindow(wnd){}; 15 CDialog(HWND wnd = NULL): CWindow(wnd) {}
15 virtual ~CDialog() {}; 16 virtual ~CDialog() {}
16 17
17 HWND GetItem(int itemID) const 18 HWND GetItem(unsigned itemID) const
18 { return GetDlgItem(_window, itemID); } 19 { return GetDlgItem(_window, (int)itemID); }
19 20
20 bool EnableItem(int itemID, bool enable) const 21 bool EnableItem(unsigned itemID, bool enable) const
21 { return BOOLToBool(::EnableWindow(GetItem(itemID), BoolToBOOL(enable))); } 22 { return BOOLToBool(::EnableWindow(GetItem(itemID), BoolToBOOL(enable))); }
22 23
23 bool ShowItem(int itemID, int cmdShow) const 24 bool ShowItem(unsigned itemID, int cmdShow) const
24 { return BOOLToBool(::ShowWindow(GetItem(itemID), cmdShow)); } 25 { return BOOLToBool(::ShowWindow(GetItem(itemID), cmdShow)); }
25 26
26 bool ShowItem_Bool(int itemID, bool show) const 27 bool ShowItem_Bool(unsigned itemID, bool show) const
27 { return ShowItem(itemID, show ? SW_SHOW: SW_HIDE); } 28 { return ShowItem(itemID, show ? SW_SHOW: SW_HIDE); }
28 29
29 bool HideItem(int itemID) const { return ShowItem(itemID, SW_HIDE); } 30 bool HideItem(unsigned itemID) const { return ShowItem(itemID, SW_HIDE); }
30 31
31 bool SetItemText(int itemID, LPCTSTR s) 32 bool SetItemText(unsigned itemID, LPCTSTR s)
32 { return BOOLToBool(SetDlgItemText(_window, itemID, s)); } 33 { return BOOLToBool(SetDlgItemText(_window, (int)itemID, s)); }
33 34
34 bool SetItemTextA(int itemID, LPCSTR s) 35 bool SetItemTextA(unsigned itemID, LPCSTR s)
35 { return BOOLToBool(SetDlgItemTextA(_window, itemID, s)); } 36 { return BOOLToBool(SetDlgItemTextA(_window, (int)itemID, s)); }
36 37
37 bool SetItemText_Empty(int itemID) 38 bool SetItemText_Empty(unsigned itemID)
38 { return SetItemText(itemID, TEXT("")); } 39 { return SetItemText(itemID, TEXT("")); }
39 40
40 #ifndef _UNICODE 41 #ifndef _UNICODE
41 bool SetItemText(int itemID, LPCWSTR s) 42 bool SetItemText(unsigned itemID, LPCWSTR s)
42 { 43 {
43 CWindow window(GetItem(itemID)); 44 CWindow window(GetItem(itemID));
44 return window.SetText(s); 45 return window.SetText(s);
45 } 46 }
46 #endif 47 #endif
47 48
48 UINT GetItemText(int itemID, LPTSTR string, int maxCount) 49 UINT GetItemText(unsigned itemID, LPTSTR string, unsigned maxCount)
49 { return GetDlgItemText(_window, itemID, string, maxCount); } 50 { return GetDlgItemText(_window, (int)itemID, string, (int)maxCount); }
50 #ifndef _UNICODE 51 #ifndef _UNICODE
51 /* 52 /*
52 bool GetItemText(int itemID, LPWSTR string, int maxCount) 53 bool GetItemText(unsigned itemID, LPWSTR string, int maxCount)
53 { 54 {
54 CWindow window(GetItem(itemID)); 55 CWindow window(GetItem(unsigned));
55 return window.GetText(string, maxCount); 56 return window.GetText(string, maxCount);
56 } 57 }
57 */ 58 */
58 #endif 59 #endif
59 60
60 bool GetItemText(int itemID, UString &s) 61 bool GetItemText(unsigned itemID, UString &s)
61 { 62 {
62 CWindow window(GetItem(itemID)); 63 CWindow window(GetItem(itemID));
63 return window.GetText(s); 64 return window.GetText(s);
64 } 65 }
65 66
66 bool SetItemInt(int itemID, UINT value, bool isSigned) 67 bool SetItemInt(unsigned itemID, UINT value, bool isSigned)
67 { return BOOLToBool(SetDlgItemInt(_window, itemID, value, BoolToBOOL(isSigned))); } 68 { return BOOLToBool(SetDlgItemInt(_window, (int)itemID, value, BoolToBOOL(isSigned))); }
68 bool GetItemInt(int itemID, bool isSigned, UINT &value) 69 bool GetItemInt(unsigned itemID, bool isSigned, UINT &value)
69 { 70 {
70 BOOL result; 71 BOOL result;
71 value = GetDlgItemInt(_window, itemID, &result, BoolToBOOL(isSigned)); 72 value = GetDlgItemInt(_window, (int)itemID, &result, BoolToBOOL(isSigned));
72 return BOOLToBool(result); 73 return BOOLToBool(result);
73 } 74 }
74 75
@@ -80,7 +81,7 @@ public:
80 LRESULT SendMsg_NextDlgCtl(WPARAM wParam, LPARAM lParam) 81 LRESULT SendMsg_NextDlgCtl(WPARAM wParam, LPARAM lParam)
81 { return SendMsg(WM_NEXTDLGCTL, wParam, lParam); } 82 { return SendMsg(WM_NEXTDLGCTL, wParam, lParam); }
82 LRESULT SendMsg_NextDlgCtl_HWND(HWND hwnd) { return SendMsg_NextDlgCtl((WPARAM)hwnd, TRUE); } 83 LRESULT SendMsg_NextDlgCtl_HWND(HWND hwnd) { return SendMsg_NextDlgCtl((WPARAM)hwnd, TRUE); }
83 LRESULT SendMsg_NextDlgCtl_CtlId(int id) { return SendMsg_NextDlgCtl_HWND(GetItem(id)); } 84 LRESULT SendMsg_NextDlgCtl_CtlId(unsigned id) { return SendMsg_NextDlgCtl_HWND(GetItem(id)); }
84 LRESULT SendMsg_NextDlgCtl_Next() { return SendMsg_NextDlgCtl(0, FALSE); } 85 LRESULT SendMsg_NextDlgCtl_Next() { return SendMsg_NextDlgCtl(0, FALSE); }
85 LRESULT SendMsg_NextDlgCtl_Prev() { return SendMsg_NextDlgCtl(1, FALSE); } 86 LRESULT SendMsg_NextDlgCtl_Prev() { return SendMsg_NextDlgCtl(1, FALSE); }
86 87
@@ -90,26 +91,27 @@ public:
90 bool IsMessage(LPMSG message) 91 bool IsMessage(LPMSG message)
91 { return BOOLToBool(IsDialogMessage(_window, message)); } 92 { return BOOLToBool(IsDialogMessage(_window, message)); }
92 93
93 LRESULT SendItemMessage(int itemID, UINT message, WPARAM wParam, LPARAM lParam) 94 LRESULT SendItemMessage(unsigned itemID, UINT message, WPARAM wParam, LPARAM lParam)
94 { return SendDlgItemMessage(_window, itemID, message, wParam, lParam); } 95 { return SendDlgItemMessage(_window, (int)itemID, message, wParam, lParam); }
95 96
96 bool CheckButton(int buttonID, UINT checkState) 97 bool CheckButton(unsigned buttonID, UINT checkState)
97 { return BOOLToBool(CheckDlgButton(_window, buttonID, checkState)); } 98 { return BOOLToBool(CheckDlgButton(_window, (int)buttonID, checkState)); }
98 bool CheckButton(int buttonID, bool checkState) 99 bool CheckButton(unsigned buttonID, bool checkState)
99 { return CheckButton(buttonID, UINT(checkState ? BST_CHECKED : BST_UNCHECKED)); } 100 { return CheckButton(buttonID, UINT(checkState ? BST_CHECKED : BST_UNCHECKED)); }
100 101
101 UINT IsButtonChecked(int buttonID) const 102 UINT IsButtonChecked_BST(unsigned buttonID) const
102 { return IsDlgButtonChecked(_window, buttonID); } 103 { return IsDlgButtonChecked(_window, (int)buttonID); }
103 bool IsButtonCheckedBool(int buttonID) const 104 bool IsButtonCheckedBool(unsigned buttonID) const
104 { return (IsButtonChecked(buttonID) == BST_CHECKED); } 105 { return (IsButtonChecked_BST(buttonID) == BST_CHECKED); }
105 106
106 bool CheckRadioButton(int firstButtonID, int lastButtonID, int checkButtonID) 107 bool CheckRadioButton(unsigned firstButtonID, unsigned lastButtonID, unsigned checkButtonID)
107 { return BOOLToBool(::CheckRadioButton(_window, firstButtonID, lastButtonID, checkButtonID)); } 108 { return BOOLToBool(::CheckRadioButton(_window,
109 (int)firstButtonID, (int)lastButtonID, (int)checkButtonID)); }
108 110
109 virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam); 111 virtual bool OnMessage(UINT message, WPARAM wParam, LPARAM lParam);
110 virtual bool OnInit() { return true; } 112 virtual bool OnInit() { return true; }
111 virtual bool OnCommand(WPARAM wParam, LPARAM lParam); 113 // virtual bool OnCommand2(WPARAM wParam, LPARAM lParam);
112 virtual bool OnCommand(int code, int itemID, LPARAM lParam); 114 virtual bool OnCommand(unsigned code, unsigned itemID, LPARAM lParam);
113 virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; } 115 virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; }
114 virtual bool OnDestroy() { return false; } 116 virtual bool OnDestroy() { return false; }
115 117
@@ -120,11 +122,11 @@ public:
120 virtual void OnHelp(LPHELPINFO) { OnHelp(); } 122 virtual void OnHelp(LPHELPINFO) { OnHelp(); }
121 #endif 123 #endif
122 */ 124 */
123 virtual void OnHelp() {}; 125 virtual void OnHelp() {}
124 126
125 virtual bool OnButtonClicked(int buttonID, HWND buttonHWND); 127 virtual bool OnButtonClicked(unsigned buttonID, HWND buttonHWND);
126 virtual void OnOK() {}; 128 virtual void OnOK() {}
127 virtual void OnCancel() {}; 129 virtual void OnCancel() {}
128 virtual void OnClose() {} 130 virtual void OnClose() {}
129 virtual bool OnNotify(UINT /* controlID */, LPNMHDR /* lParam */) { return false; } 131 virtual bool OnNotify(UINT /* controlID */, LPNMHDR /* lParam */) { return false; }
130 virtual bool OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { return false; } 132 virtual bool OnTimer(WPARAM /* timerID */, LPARAM /* callback */) { return false; }
@@ -136,9 +138,11 @@ public:
136 138
137 bool GetMargins(int margin, int &x, int &y); 139 bool GetMargins(int margin, int &x, int &y);
138 int Units_To_Pixels_X(int units); 140 int Units_To_Pixels_X(int units);
139 bool GetItemSizes(int id, int &x, int &y); 141 bool GetItemSizes(unsigned id, int &x, int &y);
140 void GetClientRectOfItem(int id, RECT &rect); 142 void GetClientRectOfItem(unsigned id, RECT &rect);
141 bool MoveItem(int id, int x, int y, int width, int height, bool repaint = true); 143 bool MoveItem(unsigned id, int x, int y, int width, int height, bool repaint = true);
144 bool MoveItem_RECT(unsigned id, const RECT &r, bool repaint = true)
145 { return MoveItem(id, r.left, r.top, RECT_SIZE_X(r), RECT_SIZE_Y(r), repaint); }
142 146
143 void NormalizeSize(bool fullNormalize = false); 147 void NormalizeSize(bool fullNormalize = false);
144 void NormalizePosition(); 148 void NormalizePosition();
@@ -152,9 +156,9 @@ public:
152 #ifndef _UNICODE 156 #ifndef _UNICODE
153 bool Create(LPCWSTR templateName, HWND parentWindow); 157 bool Create(LPCWSTR templateName, HWND parentWindow);
154 #endif 158 #endif
155 virtual void OnOK() { Destroy(); } 159 virtual void OnOK() Z7_override { Destroy(); }
156 virtual void OnCancel() { Destroy(); } 160 virtual void OnCancel() Z7_override { Destroy(); }
157 virtual void OnClose() { Destroy(); } 161 virtual void OnClose() Z7_override { Destroy(); }
158}; 162};
159 163
160class CModalDialog: public CDialog 164class CModalDialog: public CDialog
@@ -167,18 +171,18 @@ public:
167 #endif 171 #endif
168 172
169 bool End(INT_PTR result) { return BOOLToBool(::EndDialog(_window, result)); } 173 bool End(INT_PTR result) { return BOOLToBool(::EndDialog(_window, result)); }
170 virtual void OnOK() { End(IDOK); } 174 virtual void OnOK() Z7_override { End(IDOK); }
171 virtual void OnCancel() { End(IDCANCEL); } 175 virtual void OnCancel() Z7_override { End(IDCANCEL); }
172 virtual void OnClose() { End(IDCLOSE); } 176 virtual void OnClose() Z7_override { End(IDCLOSE); }
173}; 177};
174 178
175class CDialogChildControl: public NWindows::CWindow 179class CDialogChildControl: public NWindows::CWindow
176{ 180{
177 int m_ID; 181 // unsigned m_ID;
178public: 182public:
179 void Init(const NWindows::NControl::CDialog &parentDialog, int id) 183 void Init(const NWindows::NControl::CDialog &parentDialog, unsigned id)
180 { 184 {
181 m_ID = id; 185 // m_ID = id;
182 Attach(parentDialog.GetItem(id)); 186 Attach(parentDialog.GetItem(id));
183 } 187 }
184}; 188};
diff --git a/CPP/Windows/Control/Edit.h b/CPP/Windows/Control/Edit.h
index 51a22c5..963470d 100644
--- a/CPP/Windows/Control/Edit.h
+++ b/CPP/Windows/Control/Edit.h
@@ -1,7 +1,7 @@
1// Windows/Control/Edit.h 1// Windows/Control/Edit.h
2 2
3#ifndef __WINDOWS_CONTROL_EDIT_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_EDIT_H
4#define __WINDOWS_CONTROL_EDIT_H 4#define ZIP7_INC_WINDOWS_CONTROL_EDIT_H
5 5
6#include "../Window.h" 6#include "../Window.h"
7 7
diff --git a/CPP/Windows/Control/ImageList.h b/CPP/Windows/Control/ImageList.h
index 19feb11..688f177 100644
--- a/CPP/Windows/Control/ImageList.h
+++ b/CPP/Windows/Control/ImageList.h
@@ -1,7 +1,7 @@
1// Windows/Control/ImageList.h 1// Windows/Control/ImageList.h
2 2
3#ifndef __WINDOWS_CONTROL_IMAGE_LIST_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_IMAGE_LIST_H
4#define __WINDOWS_CONTROL_IMAGE_LIST_H 4#define ZIP7_INC_WINDOWS_CONTROL_IMAGE_LIST_H
5 5
6#include <CommCtrl.h> 6#include <CommCtrl.h>
7 7
@@ -56,7 +56,7 @@ public:
56 bool GetImageInfo(int index, IMAGEINFO* imageInfo) const 56 bool GetImageInfo(int index, IMAGEINFO* imageInfo) const
57 { return BOOLToBool(ImageList_GetImageInfo(m_Object, index, imageInfo)); } 57 { return BOOLToBool(ImageList_GetImageInfo(m_Object, index, imageInfo)); }
58 58
59 int Add(HBITMAP hbmImage, HBITMAP hbmMask = 0) 59 int Add(HBITMAP hbmImage, HBITMAP hbmMask = NULL)
60 { return ImageList_Add(m_Object, hbmImage, hbmMask); } 60 { return ImageList_Add(m_Object, hbmImage, hbmMask); }
61 int AddMasked(HBITMAP hbmImage, COLORREF mask) 61 int AddMasked(HBITMAP hbmImage, COLORREF mask)
62 { return ImageList_AddMasked(m_Object, hbmImage, mask); } 62 { return ImageList_AddMasked(m_Object, hbmImage, mask); }
diff --git a/CPP/Windows/Control/ListView.cpp b/CPP/Windows/Control/ListView.cpp
index 16cfd39..3e8786a 100644
--- a/CPP/Windows/Control/ListView.cpp
+++ b/CPP/Windows/Control/ListView.cpp
@@ -20,78 +20,85 @@ bool CListView::CreateEx(DWORD exStyle, DWORD style,
20 height, parentWindow, idOrHMenu, instance, createParam); 20 height, parentWindow, idOrHMenu, instance, createParam);
21} 21}
22 22
23bool CListView::GetItemParam(int index, LPARAM &param) const 23/* note: LVITEM and LVCOLUMN structures contain optional fields
24 depending from preprocessor macros:
25 #if (_WIN32_IE >= 0x0300)
26 #if (_WIN32_WINNT >= 0x0501)
27 #if (_WIN32_WINNT >= 0x0600)
28*/
29
30bool CListView::GetItemParam(unsigned index, LPARAM &param) const
24{ 31{
25 LVITEM item; 32 LVITEM item;
26 item.iItem = index; 33 item.iItem = (int)index;
27 item.iSubItem = 0; 34 item.iSubItem = 0;
28 item.mask = LVIF_PARAM; 35 item.mask = LVIF_PARAM;
29 bool aResult = GetItem(&item); 36 const bool res = GetItem(&item);
30 param = item.lParam; 37 param = item.lParam;
31 return aResult; 38 return res;
32} 39}
33 40
34int CListView::InsertColumn(int columnIndex, LPCTSTR text, int width) 41int CListView::InsertColumn(unsigned columnIndex, LPCTSTR text, int width)
35{ 42{
36 LVCOLUMN ci; 43 LVCOLUMN ci;
37 ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; 44 ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
38 ci.pszText = (LPTSTR)(void *)text; 45 ci.pszText = (LPTSTR)(void *)text;
39 ci.iSubItem = columnIndex; 46 ci.iSubItem = (int)columnIndex;
40 ci.cx = width; 47 ci.cx = width;
41 return InsertColumn(columnIndex, &ci); 48 return InsertColumn(columnIndex, &ci);
42} 49}
43 50
44int CListView::InsertItem(int index, LPCTSTR text) 51int CListView::InsertItem(unsigned index, LPCTSTR text)
45{ 52{
46 LVITEM item; 53 LVITEM item;
47 item.mask = LVIF_TEXT | LVIF_PARAM; 54 item.mask = LVIF_TEXT | LVIF_PARAM;
48 item.iItem = index; 55 item.iItem = (int)index;
49 item.lParam = index; 56 item.lParam = (LPARAM)index;
50 item.pszText = (LPTSTR)(void *)text; 57 item.pszText = (LPTSTR)(void *)text;
51 item.iSubItem = 0; 58 item.iSubItem = 0;
52 return InsertItem(&item); 59 return InsertItem(&item);
53} 60}
54 61
55int CListView::SetSubItem(int index, int subIndex, LPCTSTR text) 62int CListView::SetSubItem(unsigned index, unsigned subIndex, LPCTSTR text)
56{ 63{
57 LVITEM item; 64 LVITEM item;
58 item.mask = LVIF_TEXT; 65 item.mask = LVIF_TEXT;
59 item.iItem = index; 66 item.iItem = (int)index;
60 item.pszText = (LPTSTR)(void *)text; 67 item.pszText = (LPTSTR)(void *)text;
61 item.iSubItem = subIndex; 68 item.iSubItem = (int)subIndex;
62 return SetItem(&item); 69 return SetItem(&item);
63} 70}
64 71
65#ifndef _UNICODE 72#ifndef _UNICODE
66 73
67int CListView::InsertColumn(int columnIndex, LPCWSTR text, int width) 74int CListView::InsertColumn(unsigned columnIndex, LPCWSTR text, int width)
68{ 75{
69 LVCOLUMNW ci; 76 LVCOLUMNW ci;
70 ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM; 77 ci.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
71 ci.pszText = (LPWSTR)(void *)text; 78 ci.pszText = (LPWSTR)(void *)text;
72 ci.iSubItem = columnIndex; 79 ci.iSubItem = (int)columnIndex;
73 ci.cx = width; 80 ci.cx = width;
74 return InsertColumn(columnIndex, &ci); 81 return InsertColumn(columnIndex, &ci);
75} 82}
76 83
77int CListView::InsertItem(int index, LPCWSTR text) 84int CListView::InsertItem(unsigned index, LPCWSTR text)
78{ 85{
79 LVITEMW item; 86 LVITEMW item;
80 item.mask = LVIF_TEXT | LVIF_PARAM; 87 item.mask = LVIF_TEXT | LVIF_PARAM;
81 item.iItem = index; 88 item.iItem = (int)index;
82 item.lParam = index; 89 item.lParam = (LPARAM)index;
83 item.pszText = (LPWSTR)(void *)text; 90 item.pszText = (LPWSTR)(void *)text;
84 item.iSubItem = 0; 91 item.iSubItem = 0;
85 return InsertItem(&item); 92 return InsertItem(&item);
86} 93}
87 94
88int CListView::SetSubItem(int index, int subIndex, LPCWSTR text) 95int CListView::SetSubItem(unsigned index, unsigned subIndex, LPCWSTR text)
89{ 96{
90 LVITEMW item; 97 LVITEMW item;
91 item.mask = LVIF_TEXT; 98 item.mask = LVIF_TEXT;
92 item.iItem = index; 99 item.iItem = (int)index;
93 item.pszText = (LPWSTR)(void *)text; 100 item.pszText = (LPWSTR)(void *)text;
94 item.iSubItem = subIndex; 101 item.iSubItem = (int)subIndex;
95 return SetItem(&item); 102 return SetItem(&item);
96} 103}
97 104
diff --git a/CPP/Windows/Control/ListView.h b/CPP/Windows/Control/ListView.h
index a13b104..11a33a0 100644
--- a/CPP/Windows/Control/ListView.h
+++ b/CPP/Windows/Control/ListView.h
@@ -1,7 +1,7 @@
1// Windows/Control/ListView.h 1// Windows/Control/ListView.h
2 2
3#ifndef __WINDOWS_CONTROL_LISTVIEW_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_LISTVIEW_H
4#define __WINDOWS_CONTROL_LISTVIEW_H 4#define ZIP7_INC_WINDOWS_CONTROL_LISTVIEW_H
5 5
6#include "../../Common/MyWindows.h" 6#include "../../Common/MyWindows.h"
7 7
@@ -28,11 +28,11 @@ public:
28 } 28 }
29 29
30 bool DeleteAllItems() { return BOOLToBool(ListView_DeleteAllItems(_window)); } 30 bool DeleteAllItems() { return BOOLToBool(ListView_DeleteAllItems(_window)); }
31 bool DeleteColumn(int columnIndex) { return BOOLToBool(ListView_DeleteColumn(_window, columnIndex)); } 31 bool DeleteColumn(unsigned columnIndex) { return BOOLToBool(ListView_DeleteColumn(_window, columnIndex)); }
32 32
33 int InsertColumn(int columnIndex, const LVCOLUMN *columnInfo) { return ListView_InsertColumn(_window, columnIndex, columnInfo); } 33 int InsertColumn(unsigned columnIndex, const LVCOLUMN *columnInfo) { return ListView_InsertColumn(_window, columnIndex, columnInfo); }
34 int InsertColumn(int columnIndex, LPCTSTR text, int width); 34 int InsertColumn(unsigned columnIndex, LPCTSTR text, int width);
35 bool SetColumnOrderArray(int count, const int *columns) 35 bool SetColumnOrderArray(unsigned count, const int *columns)
36 { return BOOLToBool(ListView_SetColumnOrderArray(_window, count, (int *)(void *)columns)); } 36 { return BOOLToBool(ListView_SetColumnOrderArray(_window, count, (int *)(void *)columns)); }
37 37
38 /* 38 /*
@@ -46,43 +46,49 @@ public:
46 */ 46 */
47 47
48 int InsertItem(const LVITEM* item) { return ListView_InsertItem(_window, item); } 48 int InsertItem(const LVITEM* item) { return ListView_InsertItem(_window, item); }
49 int InsertItem(int index, LPCTSTR text); 49 int InsertItem(unsigned index, LPCTSTR text);
50 bool SetItem(const LVITEM* item) { return BOOLToBool(ListView_SetItem(_window, item)); } 50 bool SetItem(const LVITEM* item) { return BOOLToBool(ListView_SetItem(_window, item)); }
51 int SetSubItem(int index, int subIndex, LPCTSTR text); 51 int SetSubItem(unsigned index, unsigned subIndex, LPCTSTR text);
52 52
53 #ifndef _UNICODE 53 #ifndef _UNICODE
54 54
55 int InsertColumn(int columnIndex, const LVCOLUMNW *columnInfo) { return (int)SendMsg(LVM_INSERTCOLUMNW, (WPARAM)columnIndex, (LPARAM)columnInfo); } 55 int InsertColumn(unsigned columnIndex, const LVCOLUMNW *columnInfo) { return (int)SendMsg(LVM_INSERTCOLUMNW, (WPARAM)columnIndex, (LPARAM)columnInfo); }
56 int InsertColumn(int columnIndex, LPCWSTR text, int width); 56 int InsertColumn(unsigned columnIndex, LPCWSTR text, int width);
57 int InsertItem(const LV_ITEMW* item) { return (int)SendMsg(LVM_INSERTITEMW, 0, (LPARAM)item); } 57 int InsertItem(const LV_ITEMW* item) { return (int)SendMsg(LVM_INSERTITEMW, 0, (LPARAM)item); }
58 int InsertItem(int index, LPCWSTR text); 58 int InsertItem(unsigned index, LPCWSTR text);
59 bool SetItem(const LV_ITEMW* item) { return BOOLToBool((BOOL)SendMsg(LVM_SETITEMW, 0, (LPARAM)item)); } 59 bool SetItem(const LV_ITEMW* item) { return BOOLToBool((BOOL)SendMsg(LVM_SETITEMW, 0, (LPARAM)item)); }
60 int SetSubItem(int index, int subIndex, LPCWSTR text); 60 int SetSubItem(unsigned index, unsigned subIndex, LPCWSTR text);
61 61
62 #endif 62 #endif
63 63
64 bool DeleteItem(int itemIndex) { return BOOLToBool(ListView_DeleteItem(_window, itemIndex)); } 64 bool DeleteItem(unsigned itemIndex) { return BOOLToBool(ListView_DeleteItem(_window, itemIndex)); }
65 65
66 UINT GetSelectedCount() const { return ListView_GetSelectedCount(_window); } 66 UINT GetSelectedCount() const { return ListView_GetSelectedCount(_window); }
67 int GetItemCount() const { return ListView_GetItemCount(_window); } 67 int GetItemCount() const { return ListView_GetItemCount(_window); }
68 68
69 INT GetSelectionMark() const { return ListView_GetSelectionMark(_window); } 69 INT GetSelectionMark() const { return ListView_GetSelectionMark(_window); }
70 70
71 void SetItemCount(int numItems) { ListView_SetItemCount(_window, numItems); } 71 void SetItemCount(unsigned numItems) { ListView_SetItemCount(_window, numItems); }
72 void SetItemCountEx(int numItems, DWORD flags) { ListView_SetItemCountEx(_window, numItems, flags); } 72 void SetItemCountEx(unsigned numItems, DWORD flags) { ListView_SetItemCountEx(_window, numItems, flags); }
73 73
74 /* startIndex : The index of the item with which to begin the search,
75 or -1 to find the first item that matches the specified flags.
76 The specified item itself is excluded from the search. */
74 int GetNextItem(int startIndex, UINT flags) const { return ListView_GetNextItem(_window, startIndex, flags); } 77 int GetNextItem(int startIndex, UINT flags) const { return ListView_GetNextItem(_window, startIndex, flags); }
75 int GetNextSelectedItem(int startIndex) const { return GetNextItem(startIndex, LVNI_SELECTED); } 78 int GetNextSelectedItem(int startIndex) const { return GetNextItem(startIndex, LVNI_SELECTED); }
76 int GetFocusedItem() const { return GetNextItem(-1, LVNI_FOCUSED); } 79 int GetFocusedItem() const { return GetNextItem(-1, LVNI_FOCUSED); }
77 80
78 bool GetItem(LVITEM* item) const { return BOOLToBool(ListView_GetItem(_window, item)); } 81 bool GetItem(LVITEM* item) const { return BOOLToBool(ListView_GetItem(_window, item)); }
79 bool GetItemParam(int itemIndex, LPARAM &param) const; 82 bool GetItemParam(unsigned itemIndex, LPARAM &param) const;
80 void GetItemText(int itemIndex, int subItemIndex, LPTSTR text, int textSizeMax) const 83 /*
81 { ListView_GetItemText(_window, itemIndex, subItemIndex, text, textSizeMax); } 84 void GetItemText(unsigned itemIndex, unsigned subItemIndex, LPTSTR text, unsigned textSizeMax) const
85 { ListView_GetItemText(_window, itemIndex, subItemIndex, text, textSizeMax) }
86 */
82 bool SortItems(PFNLVCOMPARE compareFunction, LPARAM dataParam) 87 bool SortItems(PFNLVCOMPARE compareFunction, LPARAM dataParam)
83 { return BOOLToBool(ListView_SortItems(_window, compareFunction, dataParam)); } 88 { return BOOLToBool(ListView_SortItems(_window, compareFunction, dataParam)); }
84 89
85 void SetItemState(int index, UINT state, UINT mask) { ListView_SetItemState(_window, index, state, mask); } 90 // If (index == -1), then the state change is applied to all items.
91 void SetItemState(int index, UINT state, UINT mask) { ListView_SetItemState(_window, index, state, mask) }
86 void SetItemState_Selected(int index, bool select) { SetItemState(index, select ? LVIS_SELECTED : 0, LVIS_SELECTED); } 92 void SetItemState_Selected(int index, bool select) { SetItemState(index, select ? LVIS_SELECTED : 0, LVIS_SELECTED); }
87 void SetItemState_Selected(int index) { SetItemState(index, LVIS_SELECTED, LVIS_SELECTED); } 93 void SetItemState_Selected(int index) { SetItemState(index, LVIS_SELECTED, LVIS_SELECTED); }
88 void SelectAll() { SetItemState_Selected(-1); } 94 void SelectAll() { SetItemState_Selected(-1); }
@@ -90,7 +96,7 @@ public:
90 UINT GetItemState(int index, UINT mask) const { return ListView_GetItemState(_window, index, mask); } 96 UINT GetItemState(int index, UINT mask) const { return ListView_GetItemState(_window, index, mask); }
91 bool IsItemSelected(int index) const { return GetItemState(index, LVIS_SELECTED) == LVIS_SELECTED; } 97 bool IsItemSelected(int index) const { return GetItemState(index, LVIS_SELECTED) == LVIS_SELECTED; }
92 98
93 bool GetColumn(int columnIndex, LVCOLUMN* columnInfo) const 99 bool GetColumn(unsigned columnIndex, LVCOLUMN* columnInfo) const
94 { return BOOLToBool(ListView_GetColumn(_window, columnIndex, columnInfo)); } 100 { return BOOLToBool(ListView_GetColumn(_window, columnIndex, columnInfo)); }
95 101
96 HIMAGELIST SetImageList(HIMAGELIST imageList, int imageListType) 102 HIMAGELIST SetImageList(HIMAGELIST imageList, int imageListType)
@@ -101,7 +107,7 @@ public:
101 void SetExtendedListViewStyle(DWORD exStyle) { ListView_SetExtendedListViewStyle(_window, exStyle); } 107 void SetExtendedListViewStyle(DWORD exStyle) { ListView_SetExtendedListViewStyle(_window, exStyle); }
102 void SetExtendedListViewStyle(DWORD exMask, DWORD exStyle) { ListView_SetExtendedListViewStyleEx(_window, exMask, exStyle); } 108 void SetExtendedListViewStyle(DWORD exMask, DWORD exStyle) { ListView_SetExtendedListViewStyleEx(_window, exMask, exStyle); }
103 109
104 void SetCheckState(UINT index, bool checkState) { ListView_SetCheckState(_window, index, BoolToBOOL(checkState)); } 110 void SetCheckState(UINT index, bool checkState) { ListView_SetCheckState(_window, index, BoolToBOOL(checkState)) }
105 bool GetCheckState(UINT index) { return BOOLToBool(ListView_GetCheckState(_window, index)); } 111 bool GetCheckState(UINT index) { return BOOLToBool(ListView_GetCheckState(_window, index)); }
106 112
107 bool EnsureVisible(int index, bool partialOK) { return BOOLToBool(ListView_EnsureVisible(_window, index, BoolToBOOL(partialOK))); } 113 bool EnsureVisible(int index, bool partialOK) { return BOOLToBool(ListView_EnsureVisible(_window, index, BoolToBOOL(partialOK))); }
@@ -129,7 +135,10 @@ public:
129class CListView2: public CListView 135class CListView2: public CListView
130{ 136{
131 WNDPROC _origWindowProc; 137 WNDPROC _origWindowProc;
138 // ~CListView2() ZIP7_eq_delete;
132public: 139public:
140 virtual ~CListView2() {}
141 CListView2() {}
133 void SetWindowProc(); 142 void SetWindowProc();
134 virtual LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam); 143 virtual LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam);
135}; 144};
diff --git a/CPP/Windows/Control/ProgressBar.h b/CPP/Windows/Control/ProgressBar.h
index 0374306..2256aa9 100644
--- a/CPP/Windows/Control/ProgressBar.h
+++ b/CPP/Windows/Control/ProgressBar.h
@@ -1,7 +1,7 @@
1// Windows/Control/ProgressBar.h 1// Windows/Control/ProgressBar.h
2 2
3#ifndef __WINDOWS_CONTROL_PROGRESSBAR_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_PROGRESSBAR_H
4#define __WINDOWS_CONTROL_PROGRESSBAR_H 4#define ZIP7_INC_WINDOWS_CONTROL_PROGRESSBAR_H
5 5
6#include "../../Common/MyWindows.h" 6#include "../../Common/MyWindows.h"
7 7
@@ -15,18 +15,18 @@ namespace NControl {
15class CProgressBar: public CWindow 15class CProgressBar: public CWindow
16{ 16{
17public: 17public:
18 LRESULT SetPos(int pos) { return SendMsg(PBM_SETPOS, pos, 0); } 18 LRESULT SetPos(int pos) { return SendMsg(PBM_SETPOS, (unsigned)pos, 0); }
19 LRESULT DeltaPos(int increment) { return SendMsg(PBM_DELTAPOS, increment, 0); } 19 // LRESULT DeltaPos(int increment) { return SendMsg(PBM_DELTAPOS, increment, 0); }
20 UINT GetPos() { return (UINT)SendMsg(PBM_GETPOS, 0, 0); } 20 // UINT GetPos() { return (UINT)SendMsg(PBM_GETPOS, 0, 0); }
21 LRESULT SetRange(unsigned short minValue, unsigned short maxValue) { return SendMsg(PBM_SETRANGE, 0, MAKELPARAM(minValue, maxValue)); } 21 // LRESULT SetRange(unsigned short minValue, unsigned short maxValue) { return SendMsg(PBM_SETRANGE, 0, MAKELPARAM(minValue, maxValue)); }
22 DWORD SetRange32(int minValue, int maxValue) { return (DWORD)SendMsg(PBM_SETRANGE32, minValue, maxValue); } 22 DWORD SetRange32(int minValue, int maxValue) { return (DWORD)SendMsg(PBM_SETRANGE32, (unsigned)minValue, (LPARAM)(unsigned)maxValue); }
23 int SetStep(int step) { return (int)SendMsg(PBM_SETSTEP, step, 0); } 23 // int SetStep(int step) { return (int)SendMsg(PBM_SETSTEP, step, 0); }
24 LRESULT StepIt() { return SendMsg(PBM_STEPIT, 0, 0); } 24 // LRESULT StepIt() { return SendMsg(PBM_STEPIT, 0, 0); }
25 INT GetRange(bool minValue, PPBRANGE range) { return (INT)SendMsg(PBM_GETRANGE, BoolToBOOL(minValue), (LPARAM)range); } 25 // INT GetRange(bool minValue, PPBRANGE range) { return (INT)SendMsg(PBM_GETRANGE, BoolToBOOL(minValue), (LPARAM)range); }
26 26
27 #ifndef UNDER_CE 27 #ifndef UNDER_CE
28 COLORREF SetBarColor(COLORREF color) { return (COLORREF)SendMsg(PBM_SETBARCOLOR, 0, color); } 28 COLORREF SetBarColor(COLORREF color) { return (COLORREF)SendMsg(PBM_SETBARCOLOR, 0, (LPARAM)color); }
29 COLORREF SetBackgroundColor(COLORREF color) { return (COLORREF)SendMsg(PBM_SETBKCOLOR, 0, color); } 29 COLORREF SetBackgroundColor(COLORREF color) { return (COLORREF)SendMsg(PBM_SETBKCOLOR, 0, (LPARAM)color); }
30 #endif 30 #endif
31}; 31};
32 32
diff --git a/CPP/Windows/Control/PropertyPage.cpp b/CPP/Windows/Control/PropertyPage.cpp
index ce8696d..f8effe6 100644
--- a/CPP/Windows/Control/PropertyPage.cpp
+++ b/CPP/Windows/Control/PropertyPage.cpp
@@ -16,7 +16,13 @@ extern bool g_IsNT;
16namespace NWindows { 16namespace NWindows {
17namespace NControl { 17namespace NControl {
18 18
19static INT_PTR APIENTRY MyProperyPageProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam) 19static
20#ifdef Z7_OLD_WIN_SDK
21 BOOL
22#else
23 INT_PTR
24#endif
25APIENTRY MyProperyPageProcedure(HWND dialogHWND, UINT message, WPARAM wParam, LPARAM lParam)
20{ 26{
21 CWindow tempDialog(dialogHWND); 27 CWindow tempDialog(dialogHWND);
22 if (message == WM_INITDIALOG) 28 if (message == WM_INITDIALOG)
@@ -34,75 +40,91 @@ bool CPropertyPage::OnNotify(UINT /* controlID */, LPNMHDR lParam)
34{ 40{
35 switch (lParam->code) 41 switch (lParam->code)
36 { 42 {
37 case PSN_APPLY: SetMsgResult(OnApply(LPPSHNOTIFY(lParam))); break; 43 case PSN_APPLY: SetMsgResult(OnApply2(LPPSHNOTIFY(lParam))); break;
38 case PSN_KILLACTIVE: SetMsgResult(BoolToBOOL(OnKillActive(LPPSHNOTIFY(lParam)))); break; 44 case PSN_KILLACTIVE: SetMsgResult(BoolToBOOL(OnKillActive2(LPPSHNOTIFY(lParam)))); break;
39 case PSN_SETACTIVE: SetMsgResult(OnSetActive(LPPSHNOTIFY(lParam))); break; 45 case PSN_SETACTIVE: SetMsgResult(OnSetActive2(LPPSHNOTIFY(lParam))); break;
40 case PSN_RESET: OnReset(LPPSHNOTIFY(lParam)); break; 46 case PSN_RESET: OnReset2(LPPSHNOTIFY(lParam)); break;
41 case PSN_HELP: OnNotifyHelp(LPPSHNOTIFY(lParam)); break; 47 case PSN_HELP: OnNotifyHelp2(LPPSHNOTIFY(lParam)); break;
42 default: return false; 48 default: return false;
43 } 49 }
44 return true; 50 return true;
45} 51}
46 52
53/*
54PROPSHEETPAGE fields depend from
55#if (_WIN32_WINNT >= 0x0600)
56#elif (_WIN32_WINNT >= 0x0501)
57#elif (_WIN32_IE >= 0x0400)
58PROPSHEETHEADER fields depend from
59#if (_WIN32_IE >= 0x0400)
60*/
61#if defined(PROPSHEETPAGEA_V1_SIZE) && !defined(Z7_OLD_WIN_SDK)
62#ifndef _UNICODE
63#define my_compatib_PROPSHEETPAGEA PROPSHEETPAGEA_V1
64#endif
65#define my_compatib_PROPSHEETPAGEW PROPSHEETPAGEW_V1
66#else
67// for old mingw:
68#ifndef _UNICODE
69#define my_compatib_PROPSHEETPAGEA PROPSHEETPAGEA
70#endif
71#define my_compatib_PROPSHEETPAGEW PROPSHEETPAGEW
72#endif
73
47INT_PTR MyPropertySheet(const CObjectVector<CPageInfo> &pagesInfo, HWND hwndParent, const UString &title) 74INT_PTR MyPropertySheet(const CObjectVector<CPageInfo> &pagesInfo, HWND hwndParent, const UString &title)
48{ 75{
49 #ifndef _UNICODE
50 AStringVector titles;
51 #endif
52 #ifndef _UNICODE
53 CRecordVector<PROPSHEETPAGEA> pagesA;
54 #endif
55 CRecordVector<PROPSHEETPAGEW> pagesW;
56
57 unsigned i; 76 unsigned i;
58 #ifndef _UNICODE 77 #ifndef _UNICODE
78 AStringVector titles;
59 for (i = 0; i < pagesInfo.Size(); i++) 79 for (i = 0; i < pagesInfo.Size(); i++)
60 titles.Add(GetSystemString(pagesInfo[i].Title)); 80 titles.Add(GetSystemString(pagesInfo[i].Title));
81 CRecordVector<my_compatib_PROPSHEETPAGEA> pagesA;
61 #endif 82 #endif
83 CRecordVector<my_compatib_PROPSHEETPAGEW> pagesW;
62 84
63 for (i = 0; i < pagesInfo.Size(); i++) 85 for (i = 0; i < pagesInfo.Size(); i++)
64 { 86 {
65 const CPageInfo &pageInfo = pagesInfo[i]; 87 const CPageInfo &pageInfo = pagesInfo[i];
66 #ifndef _UNICODE 88 #ifndef _UNICODE
67 { 89 {
68 PROPSHEETPAGE page; 90 my_compatib_PROPSHEETPAGEA page;
91 memset(&page, 0, sizeof(page));
69 page.dwSize = sizeof(page); 92 page.dwSize = sizeof(page);
70 page.dwFlags = PSP_HASHELP; 93 page.dwFlags = PSP_HASHELP;
71 page.hInstance = g_hInstance; 94 page.hInstance = g_hInstance;
72 page.pszTemplate = MAKEINTRESOURCE(pageInfo.ID); 95 page.pszTemplate = MAKEINTRESOURCEA(pageInfo.ID);
73 page.pszIcon = NULL; 96 // page.pszIcon = NULL;
74 page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure; 97 page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
75 98
76 if (titles[i].IsEmpty()) 99 if (!titles[i].IsEmpty())
77 page.pszTitle = NULL;
78 else
79 { 100 {
80 page.dwFlags |= PSP_USETITLE;
81 page.pszTitle = titles[i]; 101 page.pszTitle = titles[i];
102 page.dwFlags |= PSP_USETITLE;
82 } 103 }
104 // else page.pszTitle = NULL;
83 page.lParam = (LPARAM)pageInfo.Page; 105 page.lParam = (LPARAM)pageInfo.Page;
84 page.pfnCallback = NULL; 106 // page.pfnCallback = NULL;
85 pagesA.Add(page); 107 pagesA.Add(page);
86 } 108 }
87 #endif 109 #endif
88 { 110 {
89 PROPSHEETPAGEW page; 111 my_compatib_PROPSHEETPAGEW page;
112 memset(&page, 0, sizeof(page));
90 page.dwSize = sizeof(page); 113 page.dwSize = sizeof(page);
91 page.dwFlags = PSP_HASHELP; 114 page.dwFlags = PSP_HASHELP;
92 page.hInstance = g_hInstance; 115 page.hInstance = g_hInstance;
93 page.pszTemplate = MAKEINTRESOURCEW(pageInfo.ID); 116 page.pszTemplate = MAKEINTRESOURCEW(pageInfo.ID);
94 page.pszIcon = NULL; 117 // page.pszIcon = NULL;
95 page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure; 118 page.pfnDlgProc = NWindows::NControl::MyProperyPageProcedure;
96 119
97 if (pageInfo.Title.IsEmpty()) 120 if (!pageInfo.Title.IsEmpty())
98 page.pszTitle = NULL;
99 else
100 { 121 {
101 page.dwFlags |= PSP_USETITLE;
102 page.pszTitle = pageInfo.Title; 122 page.pszTitle = pageInfo.Title;
123 page.dwFlags |= PSP_USETITLE;
103 } 124 }
125 // else page.pszTitle = NULL;
104 page.lParam = (LPARAM)pageInfo.Page; 126 page.lParam = (LPARAM)pageInfo.Page;
105 page.pfnCallback = NULL; 127 // page.pfnCallback = NULL;
106 pagesW.Add(page); 128 pagesW.Add(page);
107 } 129 }
108 } 130 }
@@ -110,16 +132,16 @@ INT_PTR MyPropertySheet(const CObjectVector<CPageInfo> &pagesInfo, HWND hwndPare
110 #ifndef _UNICODE 132 #ifndef _UNICODE
111 if (!g_IsNT) 133 if (!g_IsNT)
112 { 134 {
113 PROPSHEETHEADER sheet; 135 PROPSHEETHEADERA sheet;
114 sheet.dwSize = sizeof(sheet); 136 sheet.dwSize = sizeof(sheet);
115 sheet.dwFlags = PSH_PROPSHEETPAGE; 137 sheet.dwFlags = PSH_PROPSHEETPAGE;
116 sheet.hwndParent = hwndParent; 138 sheet.hwndParent = hwndParent;
117 sheet.hInstance = g_hInstance; 139 sheet.hInstance = g_hInstance;
118 AString titleA (GetSystemString(title)); 140 AString titleA (GetSystemString(title));
119 sheet.pszCaption = titleA; 141 sheet.pszCaption = titleA;
120 sheet.nPages = pagesInfo.Size(); 142 sheet.nPages = pagesA.Size();
121 sheet.nStartPage = 0; 143 sheet.nStartPage = 0;
122 sheet.ppsp = &pagesA.Front(); 144 sheet.ppsp = (LPCPROPSHEETPAGEA)(const void *)&pagesA.Front();
123 sheet.pfnCallback = NULL; 145 sheet.pfnCallback = NULL;
124 return ::PropertySheetA(&sheet); 146 return ::PropertySheetA(&sheet);
125 } 147 }
@@ -132,9 +154,9 @@ INT_PTR MyPropertySheet(const CObjectVector<CPageInfo> &pagesInfo, HWND hwndPare
132 sheet.hwndParent = hwndParent; 154 sheet.hwndParent = hwndParent;
133 sheet.hInstance = g_hInstance; 155 sheet.hInstance = g_hInstance;
134 sheet.pszCaption = title; 156 sheet.pszCaption = title;
135 sheet.nPages = pagesInfo.Size(); 157 sheet.nPages = pagesW.Size();
136 sheet.nStartPage = 0; 158 sheet.nStartPage = 0;
137 sheet.ppsp = &pagesW.Front(); 159 sheet.ppsp = (LPCPROPSHEETPAGEW)(const void *)&pagesW.Front();
138 sheet.pfnCallback = NULL; 160 sheet.pfnCallback = NULL;
139 return ::PropertySheetW(&sheet); 161 return ::PropertySheetW(&sheet);
140 } 162 }
diff --git a/CPP/Windows/Control/PropertyPage.h b/CPP/Windows/Control/PropertyPage.h
index b68fd8f..264a5d2 100644
--- a/CPP/Windows/Control/PropertyPage.h
+++ b/CPP/Windows/Control/PropertyPage.h
@@ -1,11 +1,11 @@
1// Windows/Control/PropertyPage.h 1// Windows/Control/PropertyPage.h
2 2
3#ifndef __WINDOWS_CONTROL_PROPERTYPAGE_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_PROPERTYPAGE_H
4#define __WINDOWS_CONTROL_PROPERTYPAGE_H 4#define ZIP7_INC_WINDOWS_CONTROL_PROPERTYPAGE_H
5 5
6#include "../../Common/MyWindows.h" 6#include "../../Common/MyWindows.h"
7 7
8#include <PrSht.h> 8#include <prsht.h>
9 9
10#include "Dialog.h" 10#include "Dialog.h"
11 11
@@ -17,23 +17,23 @@ INT_PTR APIENTRY ProperyPageProcedure(HWND dialogHWND, UINT message, WPARAM wPar
17class CPropertyPage: public CDialog 17class CPropertyPage: public CDialog
18{ 18{
19public: 19public:
20 CPropertyPage(HWND window = NULL): CDialog(window){}; 20 CPropertyPage(HWND window = NULL): CDialog(window) {}
21 21
22 void Changed() { PropSheet_Changed(GetParent(), (HWND)*this); } 22 void Changed() { PropSheet_Changed(GetParent(), (HWND)*this); }
23 void UnChanged() { PropSheet_UnChanged(GetParent(), (HWND)*this); } 23 void UnChanged() { PropSheet_UnChanged(GetParent(), (HWND)*this); }
24 24
25 virtual bool OnNotify(UINT controlID, LPNMHDR lParam); 25 virtual bool OnNotify(UINT controlID, LPNMHDR lParam) Z7_override;
26 26
27 virtual bool OnKillActive() { return false; } // false = OK 27 virtual bool OnKillActive() { return false; } // false = OK
28 virtual bool OnKillActive(const PSHNOTIFY *) { return OnKillActive(); } 28 virtual bool OnKillActive2(const PSHNOTIFY *) { return OnKillActive(); }
29 virtual LONG OnSetActive() { return false; } // false = OK 29 virtual LONG OnSetActive() { return false; } // false = OK
30 virtual LONG OnSetActive(const PSHNOTIFY *) { return OnSetActive(); } 30 virtual LONG OnSetActive2(const PSHNOTIFY *) { return OnSetActive(); }
31 virtual LONG OnApply() { return PSNRET_NOERROR; } 31 virtual LONG OnApply() { return PSNRET_NOERROR; }
32 virtual LONG OnApply(const PSHNOTIFY *) { return OnApply(); } 32 virtual LONG OnApply2(const PSHNOTIFY *) { return OnApply(); }
33 virtual void OnNotifyHelp() {} 33 virtual void OnNotifyHelp() {}
34 virtual void OnNotifyHelp(const PSHNOTIFY *) { OnNotifyHelp(); } 34 virtual void OnNotifyHelp2(const PSHNOTIFY *) { OnNotifyHelp(); }
35 virtual void OnReset() {} 35 virtual void OnReset() {}
36 virtual void OnReset(const PSHNOTIFY *) { OnReset(); } 36 virtual void OnReset2(const PSHNOTIFY *) { OnReset(); }
37}; 37};
38 38
39struct CPageInfo 39struct CPageInfo
diff --git a/CPP/Windows/Control/ReBar.h b/CPP/Windows/Control/ReBar.h
index c2d58db..b56f018 100644
--- a/CPP/Windows/Control/ReBar.h
+++ b/CPP/Windows/Control/ReBar.h
@@ -1,7 +1,7 @@
1// Windows/Control/ReBar.h 1// Windows/Control/ReBar.h
2 2
3#ifndef __WINDOWS_CONTROL_REBAR_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_REBAR_H
4#define __WINDOWS_CONTROL_REBAR_H 4#define ZIP7_INC_WINDOWS_CONTROL_REBAR_H
5 5
6#include "../Window.h" 6#include "../Window.h"
7 7
@@ -14,7 +14,7 @@ public:
14 bool SetBarInfo(LPREBARINFO barInfo) 14 bool SetBarInfo(LPREBARINFO barInfo)
15 { return LRESULTToBool(SendMsg(RB_SETBARINFO, 0, (LPARAM)barInfo)); } 15 { return LRESULTToBool(SendMsg(RB_SETBARINFO, 0, (LPARAM)barInfo)); }
16 bool InsertBand(int index, LPREBARBANDINFO bandInfo) 16 bool InsertBand(int index, LPREBARBANDINFO bandInfo)
17 { return LRESULTToBool(SendMsg(RB_INSERTBAND, index, (LPARAM)bandInfo)); } 17 { return LRESULTToBool(SendMsg(RB_INSERTBAND, MY_int_TO_WPARAM(index), (LPARAM)bandInfo)); }
18 bool SetBandInfo(unsigned index, LPREBARBANDINFO bandInfo) 18 bool SetBandInfo(unsigned index, LPREBARBANDINFO bandInfo)
19 { return LRESULTToBool(SendMsg(RB_SETBANDINFO, index, (LPARAM)bandInfo)); } 19 { return LRESULTToBool(SendMsg(RB_SETBANDINFO, index, (LPARAM)bandInfo)); }
20 void MaximizeBand(unsigned index, bool ideal) 20 void MaximizeBand(unsigned index, bool ideal)
diff --git a/CPP/Windows/Control/Static.h b/CPP/Windows/Control/Static.h
index 5523b2e..ceeedf9 100644
--- a/CPP/Windows/Control/Static.h
+++ b/CPP/Windows/Control/Static.h
@@ -1,7 +1,7 @@
1// Windows/Control/Static.h 1// Windows/Control/Static.h
2 2
3#ifndef __WINDOWS_CONTROL_STATIC_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_STATIC_H
4#define __WINDOWS_CONTROL_STATIC_H 4#define ZIP7_INC_WINDOWS_CONTROL_STATIC_H
5 5
6#include "../Window.h" 6#include "../Window.h"
7 7
diff --git a/CPP/Windows/Control/StatusBar.h b/CPP/Windows/Control/StatusBar.h
index 988b847..38aca47 100644
--- a/CPP/Windows/Control/StatusBar.h
+++ b/CPP/Windows/Control/StatusBar.h
@@ -1,7 +1,7 @@
1// Windows/Control/StatusBar.h 1// Windows/Control/StatusBar.h
2 2
3#ifndef __WINDOWS_CONTROL_STATUSBAR_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_STATUSBAR_H
4#define __WINDOWS_CONTROL_STATUSBAR_H 4#define ZIP7_INC_WINDOWS_CONTROL_STATUSBAR_H
5 5
6#include "../Window.h" 6#include "../Window.h"
7 7
@@ -12,7 +12,7 @@ class CStatusBar: public NWindows::CWindow
12{ 12{
13public: 13public:
14 bool Create(LONG style, LPCTSTR text, HWND hwndParent, UINT id) 14 bool Create(LONG style, LPCTSTR text, HWND hwndParent, UINT id)
15 { return (_window = ::CreateStatusWindow(style, text, hwndParent, id)) != 0; } 15 { return (_window = ::CreateStatusWindow(style, text, hwndParent, id)) != NULL; }
16 bool SetText(LPCTSTR text) 16 bool SetText(LPCTSTR text)
17 { return CWindow::SetText(text); } 17 { return CWindow::SetText(text); }
18 bool SetText(unsigned index, LPCTSTR text, UINT type) 18 bool SetText(unsigned index, LPCTSTR text, UINT type)
@@ -22,7 +22,7 @@ public:
22 22
23 #ifndef _UNICODE 23 #ifndef _UNICODE
24 bool Create(LONG style, LPCWSTR text, HWND hwndParent, UINT id) 24 bool Create(LONG style, LPCWSTR text, HWND hwndParent, UINT id)
25 { return (_window = ::CreateStatusWindowW(style, text, hwndParent, id)) != 0; } 25 { return (_window = ::CreateStatusWindowW(style, text, hwndParent, id)) != NULL; }
26 bool SetText(LPCWSTR text) 26 bool SetText(LPCWSTR text)
27 { return CWindow::SetText(text); } 27 { return CWindow::SetText(text); }
28 bool SetText(unsigned index, LPCWSTR text, UINT type) 28 bool SetText(unsigned index, LPCWSTR text, UINT type)
@@ -34,7 +34,7 @@ public:
34 bool SetParts(unsigned numParts, const int *edgePostions) 34 bool SetParts(unsigned numParts, const int *edgePostions)
35 { return LRESULTToBool(SendMsg(SB_SETPARTS, numParts, (LPARAM)edgePostions)); } 35 { return LRESULTToBool(SendMsg(SB_SETPARTS, numParts, (LPARAM)edgePostions)); }
36 void Simple(bool simple) 36 void Simple(bool simple)
37 { SendMsg(SB_SIMPLE, BoolToBOOL(simple), 0); } 37 { SendMsg(SB_SIMPLE, (WPARAM)BoolToBOOL(simple), 0); }
38}; 38};
39 39
40}} 40}}
diff --git a/CPP/Windows/Control/StdAfx.h b/CPP/Windows/Control/StdAfx.h
index 1cbd7fe..8086655 100644
--- a/CPP/Windows/Control/StdAfx.h
+++ b/CPP/Windows/Control/StdAfx.h
@@ -1,8 +1,11 @@
1// StdAfx.h 1// StdAfx.h
2 2
3#ifndef __STDAFX_H 3#ifndef ZIP7_INC_STDAFX_H
4#define __STDAFX_H 4#define ZIP7_INC_STDAFX_H
5 5
6#if defined(_MSC_VER) && _MSC_VER >= 1800
7#pragma warning(disable : 4464) // relative include path contains '..'
8#endif
6#include "../../Common/Common.h" 9#include "../../Common/Common.h"
7 10
8#endif 11#endif
diff --git a/CPP/Windows/Control/ToolBar.h b/CPP/Windows/Control/ToolBar.h
index 7bc93a2..2bf20a5 100644
--- a/CPP/Windows/Control/ToolBar.h
+++ b/CPP/Windows/Control/ToolBar.h
@@ -1,7 +1,7 @@
1// Windows/Control/ToolBar.h 1// Windows/Control/ToolBar.h
2 2
3#ifndef __WINDOWS_CONTROL_TOOLBAR_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_TOOLBAR_H
4#define __WINDOWS_CONTROL_TOOLBAR_H 4#define ZIP7_INC_WINDOWS_CONTROL_TOOLBAR_H
5 5
6#include "../Window.h" 6#include "../Window.h"
7 7
@@ -18,7 +18,7 @@ public:
18 #ifdef UNDER_CE 18 #ifdef UNDER_CE
19 { 19 {
20 // maybe it must be fixed for more than 1 buttons 20 // maybe it must be fixed for more than 1 buttons
21 DWORD val = GetButtonSize(); 21 const DWORD val = GetButtonSize();
22 size->cx = LOWORD(val); 22 size->cx = LOWORD(val);
23 size->cy = HIWORD(val); 23 size->cy = HIWORD(val);
24 return true; 24 return true;
diff --git a/CPP/Windows/Control/Trackbar.h b/CPP/Windows/Control/Trackbar.h
index 313e0c8..18d1b29 100644
--- a/CPP/Windows/Control/Trackbar.h
+++ b/CPP/Windows/Control/Trackbar.h
@@ -1,7 +1,7 @@
1// Windows/Control/Trackbar.h 1// Windows/Control/Trackbar.h
2 2
3#ifndef __WINDOWS_CONTROL_TRACKBAR_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_TRACKBAR_H
4#define __WINDOWS_CONTROL_TRACKBAR_H 4#define ZIP7_INC_WINDOWS_CONTROL_TRACKBAR_H
5 5
6#include "../Window.h" 6#include "../Window.h"
7 7
diff --git a/CPP/Windows/Control/Window2.cpp b/CPP/Windows/Control/Window2.cpp
index 994d96e..8fe908e 100644
--- a/CPP/Windows/Control/Window2.cpp
+++ b/CPP/Windows/Control/Window2.cpp
@@ -32,9 +32,9 @@ static LRESULT CALLBACK WindowProcedure(HWND aHWND, UINT message, WPARAM wParam,
32 if (message == MY_START_WM_CREATE) 32 if (message == MY_START_WM_CREATE)
33 tempWindow.SetUserDataLongPtr((LONG_PTR)(((LPCREATESTRUCT)lParam)->lpCreateParams)); 33 tempWindow.SetUserDataLongPtr((LONG_PTR)(((LPCREATESTRUCT)lParam)->lpCreateParams));
34 CWindow2 *window = (CWindow2 *)(tempWindow.GetUserDataLongPtr()); 34 CWindow2 *window = (CWindow2 *)(tempWindow.GetUserDataLongPtr());
35 if (window != NULL && message == MY_START_WM_CREATE) 35 if (window && message == MY_START_WM_CREATE)
36 window->Attach(aHWND); 36 window->Attach(aHWND);
37 if (window == 0) 37 if (!window)
38 { 38 {
39 #ifndef _UNICODE 39 #ifndef _UNICODE
40 if (g_IsNT) 40 if (g_IsNT)
@@ -140,7 +140,7 @@ LRESULT CWindow2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
140 return -1; 140 return -1;
141 break; 141 break;
142 case WM_COMMAND: 142 case WM_COMMAND:
143 if (OnCommand(wParam, lParam, result)) 143 if (OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result))
144 return result; 144 return result;
145 break; 145 break;
146 case WM_NOTIFY: 146 case WM_NOTIFY:
@@ -160,12 +160,14 @@ LRESULT CWindow2::OnMessage(UINT message, WPARAM wParam, LPARAM lParam)
160 return DefProc(message, wParam, lParam); 160 return DefProc(message, wParam, lParam);
161} 161}
162 162
163bool CWindow2::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result) 163/*
164bool CWindow2::OnCommand2(WPARAM wParam, LPARAM lParam, LRESULT &result)
164{ 165{
165 return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result); 166 return OnCommand(HIWORD(wParam), LOWORD(wParam), lParam, result);
166} 167}
168*/
167 169
168bool CWindow2::OnCommand(int /* code */, int /* itemID */, LPARAM /* lParam */, LRESULT & /* result */) 170bool CWindow2::OnCommand(unsigned /* code */, unsigned /* itemID */, LPARAM /* lParam */, LRESULT & /* result */)
169{ 171{
170 return false; 172 return false;
171 // return DefProc(message, wParam, lParam); 173 // return DefProc(message, wParam, lParam);
@@ -176,7 +178,7 @@ bool CWindow2::OnCommand(int /* code */, int /* itemID */, LPARAM /* lParam */,
176} 178}
177 179
178/* 180/*
179bool CDialog::OnButtonClicked(int buttonID, HWND buttonHWND) 181bool CDialog::OnButtonClicked(unsigned buttonID, HWND buttonHWND)
180{ 182{
181 switch (buttonID) 183 switch (buttonID)
182 { 184 {
diff --git a/CPP/Windows/Control/Window2.h b/CPP/Windows/Control/Window2.h
index 7ac580c..ebb5979 100644
--- a/CPP/Windows/Control/Window2.h
+++ b/CPP/Windows/Control/Window2.h
@@ -1,7 +1,7 @@
1// Windows/Control/Window2.h 1// Windows/Control/Window2.h
2 2
3#ifndef __WINDOWS_CONTROL_WINDOW2_H 3#ifndef ZIP7_INC_WINDOWS_CONTROL_WINDOW2_H
4#define __WINDOWS_CONTROL_WINDOW2_H 4#define ZIP7_INC_WINDOWS_CONTROL_WINDOW2_H
5 5
6#include "../Window.h" 6#include "../Window.h"
7 7
@@ -10,10 +10,12 @@ namespace NControl {
10 10
11class CWindow2: public CWindow 11class CWindow2: public CWindow
12{ 12{
13 // Z7_CLASS_NO_COPY(CWindow2)
14
13 LRESULT DefProc(UINT message, WPARAM wParam, LPARAM lParam); 15 LRESULT DefProc(UINT message, WPARAM wParam, LPARAM lParam);
14public: 16public:
15 CWindow2(HWND newWindow = NULL): CWindow(newWindow){}; 17 CWindow2(HWND newWindow = NULL): CWindow(newWindow) {}
16 virtual ~CWindow2() {}; 18 virtual ~CWindow2() {}
17 19
18 bool CreateEx(DWORD exStyle, LPCTSTR className, LPCTSTR windowName, 20 bool CreateEx(DWORD exStyle, LPCTSTR className, LPCTSTR windowName,
19 DWORD style, int x, int y, int width, int height, 21 DWORD style, int x, int y, int width, int height,
@@ -28,8 +30,8 @@ public:
28 virtual LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam); 30 virtual LRESULT OnMessage(UINT message, WPARAM wParam, LPARAM lParam);
29 virtual bool OnCreate(CREATESTRUCT * /* createStruct */) { return true; } 31 virtual bool OnCreate(CREATESTRUCT * /* createStruct */) { return true; }
30 // virtual LRESULT OnCommand(WPARAM wParam, LPARAM lParam); 32 // virtual LRESULT OnCommand(WPARAM wParam, LPARAM lParam);
31 virtual bool OnCommand(WPARAM wParam, LPARAM lParam, LRESULT &result); 33 // bool OnCommand2(WPARAM wParam, LPARAM lParam, LRESULT &result);
32 virtual bool OnCommand(int code, int itemID, LPARAM lParam, LRESULT &result); 34 virtual bool OnCommand(unsigned code, unsigned itemID, LPARAM lParam, LRESULT &result);
33 virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; } 35 virtual bool OnSize(WPARAM /* wParam */, int /* xSize */, int /* ySize */) { return false; }
34 virtual bool OnNotify(UINT /* controlID */, LPNMHDR /* lParam */, LRESULT & /* result */) { return false; } 36 virtual bool OnNotify(UINT /* controlID */, LPNMHDR /* lParam */, LRESULT & /* result */) { return false; }
35 virtual void OnDestroy() { PostQuitMessage(0); } 37 virtual void OnDestroy() { PostQuitMessage(0); }
@@ -37,7 +39,7 @@ public:
37 /* 39 /*
38 virtual LRESULT OnHelp(LPHELPINFO helpInfo) { OnHelp(); } 40 virtual LRESULT OnHelp(LPHELPINFO helpInfo) { OnHelp(); }
39 virtual LRESULT OnHelp() {}; 41 virtual LRESULT OnHelp() {};
40 virtual bool OnButtonClicked(int buttonID, HWND buttonHWND); 42 virtual bool OnButtonClicked(unsigned buttonID, HWND buttonHWND);
41 virtual void OnOK() {}; 43 virtual void OnOK() {};
42 virtual void OnCancel() {}; 44 virtual void OnCancel() {};
43 */ 45 */
diff --git a/CPP/Windows/DLL.cpp b/CPP/Windows/DLL.cpp
index cf5d01a..b2499ec 100644
--- a/CPP/Windows/DLL.cpp
+++ b/CPP/Windows/DLL.cpp
@@ -17,11 +17,11 @@ namespace NDLL {
17 17
18bool CLibrary::Free() throw() 18bool CLibrary::Free() throw()
19{ 19{
20 if (_module == 0) 20 if (_module == NULL)
21 return true; 21 return true;
22 if (!::FreeLibrary(_module)) 22 if (!::FreeLibrary(_module))
23 return false; 23 return false;
24 _module = 0; 24 _module = NULL;
25 return true; 25 return true;
26} 26}
27 27
@@ -90,7 +90,7 @@ bool MyGetModuleFileName(FString &path)
90 return false; 90 return false;
91} 91}
92 92
93#ifndef _SFX 93#ifndef Z7_SFX
94 94
95FString GetModuleDirPrefix() 95FString GetModuleDirPrefix()
96{ 96{
@@ -110,38 +110,35 @@ FString GetModuleDirPrefix()
110 110
111}} 111}}
112 112
113#else 113#else // _WIN32
114 114
115#include <dlfcn.h> 115#include <dlfcn.h>
116#include <stdlib.h> 116#include <stdlib.h>
117#include "../Common/Common.h"
118
119// FARPROC
120void *GetProcAddress(HMODULE module, LPCSTR procName)
121{
122 void *ptr = NULL;
123 if (module)
124 ptr = dlsym(module, procName);
125 return ptr;
126}
117 127
118namespace NWindows { 128namespace NWindows {
119namespace NDLL { 129namespace NDLL {
120 130
121bool CLibrary::Free() throw() 131bool CLibrary::Free() throw()
122{ 132{
123 if (_module == NULL) 133 if (!_module)
124 return true; 134 return true;
125 int ret = dlclose(_module); 135 const int ret = dlclose(_module);
126 if (ret != 0) 136 if (ret != 0)
127 return false; 137 return false;
128 _module = NULL; 138 _module = NULL;
129 return true; 139 return true;
130} 140}
131 141
132static
133// FARPROC
134void *
135local_GetProcAddress(HMODULE module, LPCSTR procName)
136{
137 void *ptr = NULL;
138 if (module)
139 {
140 ptr = dlsym(module, procName);
141 }
142 return ptr;
143}
144
145bool CLibrary::Load(CFSTR path) throw() 142bool CLibrary::Load(CFSTR path) throw()
146{ 143{
147 if (!Free()) 144 if (!Free())
@@ -163,21 +160,11 @@ bool CLibrary::Load(CFSTR path) throw()
163 #endif 160 #endif
164 #endif 161 #endif
165 162
166 void *handler = dlopen(path, options); 163 _module = dlopen(path, options);
167
168 if (handler)
169 {
170 // here we can transfer some settings to DLL
171 }
172 else
173 {
174 }
175
176 _module = handler;
177
178 return (_module != NULL); 164 return (_module != NULL);
179} 165}
180 166
167/*
181// FARPROC 168// FARPROC
182void * CLibrary::GetProc(LPCSTR procName) const 169void * CLibrary::GetProc(LPCSTR procName) const
183{ 170{
@@ -185,6 +172,7 @@ void * CLibrary::GetProc(LPCSTR procName) const
185 return local_GetProcAddress(_module, procName); 172 return local_GetProcAddress(_module, procName);
186 // return NULL; 173 // return NULL;
187} 174}
175*/
188 176
189}} 177}}
190 178
diff --git a/CPP/Windows/DLL.h b/CPP/Windows/DLL.h
index 0c093ee..19a82b3 100644
--- a/CPP/Windows/DLL.h
+++ b/CPP/Windows/DLL.h
@@ -1,20 +1,29 @@
1// Windows/DLL.h 1// Windows/DLL.h
2 2
3#ifndef __WINDOWS_DLL_H 3#ifndef ZIP7_INC_WINDOWS_DLL_H
4#define __WINDOWS_DLL_H 4#define ZIP7_INC_WINDOWS_DLL_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7 7
8#ifndef _WIN32
9typedef void * HMODULE;
10// typedef int (*FARPROC)();
11// typedef void *FARPROC;
12void *GetProcAddress(HMODULE module, LPCSTR procName);
13#endif
14
8namespace NWindows { 15namespace NWindows {
9namespace NDLL { 16namespace NDLL {
10 17
11#ifdef _WIN32 18#ifdef _WIN32
12 19
20/*
13#ifdef UNDER_CE 21#ifdef UNDER_CE
14#define My_GetProcAddress(module, procName) (void *)::GetProcAddressA(module, procName) 22#define My_GetProcAddress(module, procName) (void *)::GetProcAddressA(module, procName)
15#else 23#else
16#define My_GetProcAddress(module, procName) (void *)::GetProcAddress(module, procName) 24#define My_GetProcAddress(module, procName) (void *)::GetProcAddress(module, procName)
17#endif 25#endif
26*/
18 27
19/* Win32: Don't call CLibrary::Free() and FreeLibrary() from another 28/* Win32: Don't call CLibrary::Free() and FreeLibrary() from another
20 FreeLibrary() code: detaching code in DLL entry-point or in 29 FreeLibrary() code: detaching code in DLL entry-point or in
@@ -24,13 +33,25 @@ class CLibrary
24{ 33{
25 HMODULE _module; 34 HMODULE _module;
26 35
27 // CLASS_NO_COPY(CLibrary); 36 // Z7_CLASS_NO_COPY(CLibrary);
37 // copy constructor is required here
28public: 38public:
29 CLibrary(): _module(NULL) {}; 39 CLibrary(): _module(NULL) {}
30 ~CLibrary() { Free(); } 40 ~CLibrary() { Free(); }
31 41
32 operator HMODULE() const { return _module; } 42 CLibrary(const CLibrary &c): _module(NULL)
33 HMODULE* operator&() { return &_module; } 43 {
44 if (c._module)
45 {
46 // we need non const to reference from original item
47 // c._module = NULL;
48 throw 20230102;
49 }
50 }
51
52 HMODULE Get_HMODULE() const { return _module; }
53 // operator HMODULE() const { return _module; }
54 // HMODULE* operator&() { return &_module; }
34 bool IsLoaded() const { return (_module != NULL); } 55 bool IsLoaded() const { return (_module != NULL); }
35 56
36 void Attach(HMODULE m) 57 void Attach(HMODULE m)
@@ -40,7 +61,7 @@ public:
40 } 61 }
41 HMODULE Detach() 62 HMODULE Detach()
42 { 63 {
43 HMODULE m = _module; 64 const HMODULE m = _module;
44 _module = NULL; 65 _module = NULL;
45 return m; 66 return m;
46 } 67 }
@@ -49,28 +70,26 @@ public:
49 bool LoadEx(CFSTR path, DWORD flags = LOAD_LIBRARY_AS_DATAFILE) throw(); 70 bool LoadEx(CFSTR path, DWORD flags = LOAD_LIBRARY_AS_DATAFILE) throw();
50 bool Load(CFSTR path) throw(); 71 bool Load(CFSTR path) throw();
51 // FARPROC 72 // FARPROC
52 void *GetProc(LPCSTR procName) const { return My_GetProcAddress(_module, procName); } 73 // void *GetProc(LPCSTR procName) const { return My_GetProcAddress(_module, procName); }
53}; 74};
54 75
55#else 76#else
56 77
57typedef void * HMODULE;
58// typedef int (*FARPROC)();
59// typedef void *FARPROC;
60
61class CLibrary 78class CLibrary
62{ 79{
63 HMODULE _module; 80 HMODULE _module;
64 81
65 // CLASS_NO_COPY(CLibrary); 82 // Z7_CLASS_NO_COPY(CLibrary);
66public: 83public:
67 CLibrary(): _module(NULL) {}; 84 CLibrary(): _module(NULL) {}
68 ~CLibrary() { Free(); } 85 ~CLibrary() { Free(); }
69 86
87 HMODULE Get_HMODULE() const { return _module; }
88
70 bool Free() throw(); 89 bool Free() throw();
71 bool Load(CFSTR path) throw(); 90 bool Load(CFSTR path) throw();
72 // FARPROC 91 // FARPROC
73 void *GetProc(LPCSTR procName) const; // { return My_GetProcAddress(_module, procName); } 92 // void *GetProc(LPCSTR procName) const; // { return My_GetProcAddress(_module, procName); }
74}; 93};
75 94
76#endif 95#endif
diff --git a/CPP/Windows/Defs.h b/CPP/Windows/Defs.h
index 1d96078..8ab9cf5 100644
--- a/CPP/Windows/Defs.h
+++ b/CPP/Windows/Defs.h
@@ -1,12 +1,11 @@
1// Windows/Defs.h 1// Windows/Defs.h
2 2
3#ifndef __WINDOWS_DEFS_H 3#ifndef ZIP7_INC_WINDOWS_DEFS_H
4#define __WINDOWS_DEFS_H 4#define ZIP7_INC_WINDOWS_DEFS_H
5 5
6#include "../Common/MyWindows.h" 6#include "../Common/MyWindows.h"
7 7
8#ifdef _WIN32 8#ifdef _WIN32
9inline bool LRESULTToBool(LRESULT v) { return (v != FALSE); }
10inline BOOL BoolToBOOL(bool v) { return (v ? TRUE: FALSE); } 9inline BOOL BoolToBOOL(bool v) { return (v ? TRUE: FALSE); }
11#endif 10#endif
12 11
diff --git a/CPP/Windows/ErrorMsg.cpp b/CPP/Windows/ErrorMsg.cpp
index f6343a5..5acf3ad 100644
--- a/CPP/Windows/ErrorMsg.cpp
+++ b/CPP/Windows/ErrorMsg.cpp
@@ -19,8 +19,8 @@ namespace NError {
19 19
20static bool MyFormatMessage(DWORD errorCode, UString &message) 20static bool MyFormatMessage(DWORD errorCode, UString &message)
21{ 21{
22 #ifndef _SFX 22 #ifndef Z7_SFX
23 if ((HRESULT)errorCode == MY_HRES_ERROR__INTERNAL_ERROR) 23 if ((HRESULT)errorCode == MY_HRES_ERROR_INTERNAL_ERROR)
24 { 24 {
25 message = "Internal Error: The failure in hardware (RAM or CPU), OS or program"; 25 message = "Internal Error: The failure in hardware (RAM or CPU), OS or program";
26 return true; 26 return true;
@@ -72,7 +72,7 @@ static bool MyFormatMessage(DWORD errorCode, UString &message)
72 case E_OUTOFMEMORY : s = "E_OUTOFMEMORY : Can't allocate required memory"; break; 72 case E_OUTOFMEMORY : s = "E_OUTOFMEMORY : Can't allocate required memory"; break;
73 case E_INVALIDARG : s = "E_INVALIDARG : One or more arguments are invalid"; break; 73 case E_INVALIDARG : s = "E_INVALIDARG : One or more arguments are invalid"; break;
74 74
75 // case MY__E_ERROR_NEGATIVE_SEEK : s = "MY__E_ERROR_NEGATIVE_SEEK"; break; 75 // case MY_E_ERROR_NEGATIVE_SEEK : s = "MY_E_ERROR_NEGATIVE_SEEK"; break;
76 default: 76 default:
77 break; 77 break;
78 } 78 }
@@ -81,7 +81,7 @@ static bool MyFormatMessage(DWORD errorCode, UString &message)
81 So we must transfer error codes before strerror() */ 81 So we must transfer error codes before strerror() */
82 if (!s) 82 if (!s)
83 { 83 {
84 if ((errorCode & 0xFFFF0000) == (UInt32)((MY__FACILITY__WRes << 16) | 0x80000000)) 84 if ((errorCode & 0xFFFF0000) == (UInt32)((MY_FACILITY_WRes << 16) | 0x80000000))
85 errorCode &= 0xFFFF; 85 errorCode &= 0xFFFF;
86 else if ((errorCode & ((UInt32)1 << 31))) 86 else if ((errorCode & ((UInt32)1 << 31)))
87 return false; // we will show hex error later for that case 87 return false; // we will show hex error later for that case
diff --git a/CPP/Windows/ErrorMsg.h b/CPP/Windows/ErrorMsg.h
index 01204eb..6142b4e 100644
--- a/CPP/Windows/ErrorMsg.h
+++ b/CPP/Windows/ErrorMsg.h
@@ -1,7 +1,7 @@
1// Windows/ErrorMsg.h 1// Windows/ErrorMsg.h
2 2
3#ifndef __WINDOWS_ERROR_MSG_H 3#ifndef ZIP7_INC_WINDOWS_ERROR_MSG_H
4#define __WINDOWS_ERROR_MSG_H 4#define ZIP7_INC_WINDOWS_ERROR_MSG_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7 7
diff --git a/CPP/Windows/FileDir.cpp b/CPP/Windows/FileDir.cpp
index cce2638..5b1f340 100644
--- a/CPP/Windows/FileDir.cpp
+++ b/CPP/Windows/FileDir.cpp
@@ -65,46 +65,55 @@ namespace NDir {
65 65
66bool GetWindowsDir(FString &path) 66bool GetWindowsDir(FString &path)
67{ 67{
68 UINT needLength; 68 const unsigned kBufSize = MAX_PATH + 16;
69 UINT len;
69 #ifndef _UNICODE 70 #ifndef _UNICODE
70 if (!g_IsNT) 71 if (!g_IsNT)
71 { 72 {
72 TCHAR s[MAX_PATH + 2]; 73 TCHAR s[kBufSize + 1];
73 s[0] = 0; 74 s[0] = 0;
74 needLength = ::GetWindowsDirectory(s, MAX_PATH + 1); 75 len = ::GetWindowsDirectory(s, kBufSize);
75 path = fas2fs(s); 76 path = fas2fs(s);
76 } 77 }
77 else 78 else
78 #endif 79 #endif
79 { 80 {
80 WCHAR s[MAX_PATH + 2]; 81 WCHAR s[kBufSize + 1];
81 s[0] = 0; 82 s[0] = 0;
82 needLength = ::GetWindowsDirectoryW(s, MAX_PATH + 1); 83 len = ::GetWindowsDirectoryW(s, kBufSize);
83 path = us2fs(s); 84 path = us2fs(s);
84 } 85 }
85 return (needLength > 0 && needLength <= MAX_PATH); 86 return (len != 0 && len < kBufSize);
86} 87}
87 88
89
90/*
91new DOCs for GetSystemDirectory:
92 returned path does not end with a backslash unless the
93 system directory is the root directory.
94*/
95
88bool GetSystemDir(FString &path) 96bool GetSystemDir(FString &path)
89{ 97{
90 UINT needLength; 98 const unsigned kBufSize = MAX_PATH + 16;
99 UINT len;
91 #ifndef _UNICODE 100 #ifndef _UNICODE
92 if (!g_IsNT) 101 if (!g_IsNT)
93 { 102 {
94 TCHAR s[MAX_PATH + 2]; 103 TCHAR s[kBufSize + 1];
95 s[0] = 0; 104 s[0] = 0;
96 needLength = ::GetSystemDirectory(s, MAX_PATH + 1); 105 len = ::GetSystemDirectory(s, kBufSize);
97 path = fas2fs(s); 106 path = fas2fs(s);
98 } 107 }
99 else 108 else
100 #endif 109 #endif
101 { 110 {
102 WCHAR s[MAX_PATH + 2]; 111 WCHAR s[kBufSize + 1];
103 s[0] = 0; 112 s[0] = 0;
104 needLength = ::GetSystemDirectoryW(s, MAX_PATH + 1); 113 len = ::GetSystemDirectoryW(s, kBufSize);
105 path = us2fs(s); 114 path = us2fs(s);
106 } 115 }
107 return (needLength > 0 && needLength <= MAX_PATH); 116 return (len != 0 && len < kBufSize);
108} 117}
109#endif // UNDER_CE 118#endif // UNDER_CE
110 119
@@ -123,7 +132,7 @@ bool SetDirTime(CFSTR path, const CFiTime *cTime, const CFiTime *aTime, const CF
123 IF_USE_MAIN_PATH 132 IF_USE_MAIN_PATH
124 hDir = ::CreateFileW(fs2us(path), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 133 hDir = ::CreateFileW(fs2us(path), GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
125 NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL); 134 NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
126 #ifdef WIN_LONG_PATH 135 #ifdef Z7_LONG_PATH
127 if (hDir == INVALID_HANDLE_VALUE && USE_SUPER_PATH) 136 if (hDir == INVALID_HANDLE_VALUE && USE_SUPER_PATH)
128 { 137 {
129 UString superPath; 138 UString superPath;
@@ -158,7 +167,7 @@ bool SetFileAttrib(CFSTR path, DWORD attrib)
158 IF_USE_MAIN_PATH 167 IF_USE_MAIN_PATH
159 if (::SetFileAttributesW(fs2us(path), attrib)) 168 if (::SetFileAttributesW(fs2us(path), attrib))
160 return true; 169 return true;
161 #ifdef WIN_LONG_PATH 170 #ifdef Z7_LONG_PATH
162 if (USE_SUPER_PATH) 171 if (USE_SUPER_PATH)
163 { 172 {
164 UString superPath; 173 UString superPath;
@@ -195,7 +204,7 @@ bool RemoveDir(CFSTR path)
195 IF_USE_MAIN_PATH 204 IF_USE_MAIN_PATH
196 if (::RemoveDirectoryW(fs2us(path))) 205 if (::RemoveDirectoryW(fs2us(path)))
197 return true; 206 return true;
198 #ifdef WIN_LONG_PATH 207 #ifdef Z7_LONG_PATH
199 if (USE_SUPER_PATH) 208 if (USE_SUPER_PATH)
200 { 209 {
201 UString superPath; 210 UString superPath;
@@ -224,7 +233,7 @@ bool MyMoveFile(CFSTR oldFile, CFSTR newFile)
224 if (::MoveFileW(fs2us(oldFile), fs2us(newFile))) 233 if (::MoveFileW(fs2us(oldFile), fs2us(newFile)))
225 return true; 234 return true;
226 } 235 }
227 #ifdef WIN_LONG_PATH 236 #ifdef Z7_LONG_PATH
228 if (USE_SUPER_PATH_2) 237 if (USE_SUPER_PATH_2)
229 { 238 {
230 UString d1, d2; 239 UString d1, d2;
@@ -261,8 +270,11 @@ bool MyCreateHardLink(CFSTR newFileName, CFSTR existFileName)
261 else 270 else
262 #endif 271 #endif
263 { 272 {
264 Func_CreateHardLinkW my_CreateHardLinkW = (Func_CreateHardLinkW) 273 const
265 (void *)::GetProcAddress(::GetModuleHandleW(L"kernel32.dll"), "CreateHardLinkW"); 274 Func_CreateHardLinkW
275 my_CreateHardLinkW = Z7_GET_PROC_ADDRESS(
276 Func_CreateHardLinkW, ::GetModuleHandleW(L"kernel32.dll"),
277 "CreateHardLinkW");
266 if (!my_CreateHardLinkW) 278 if (!my_CreateHardLinkW)
267 return false; 279 return false;
268 IF_USE_MAIN_PATH_2(newFileName, existFileName) 280 IF_USE_MAIN_PATH_2(newFileName, existFileName)
@@ -270,7 +282,7 @@ bool MyCreateHardLink(CFSTR newFileName, CFSTR existFileName)
270 if (my_CreateHardLinkW(fs2us(newFileName), fs2us(existFileName), NULL)) 282 if (my_CreateHardLinkW(fs2us(newFileName), fs2us(existFileName), NULL))
271 return true; 283 return true;
272 } 284 }
273 #ifdef WIN_LONG_PATH 285 #ifdef Z7_LONG_PATH
274 if (USE_SUPER_PATH_2) 286 if (USE_SUPER_PATH_2)
275 { 287 {
276 UString d1, d2; 288 UString d1, d2;
@@ -320,7 +332,7 @@ bool CreateDir(CFSTR path)
320 IF_USE_MAIN_PATH 332 IF_USE_MAIN_PATH
321 if (::CreateDirectoryW(fs2us(path), NULL)) 333 if (::CreateDirectoryW(fs2us(path), NULL))
322 return true; 334 return true;
323 #ifdef WIN_LONG_PATH 335 #ifdef Z7_LONG_PATH
324 if ((!USE_MAIN_PATH || ::GetLastError() != ERROR_ALREADY_EXISTS) && USE_SUPER_PATH) 336 if ((!USE_MAIN_PATH || ::GetLastError() != ERROR_ALREADY_EXISTS) && USE_SUPER_PATH)
325 { 337 {
326 UString superPath; 338 UString superPath;
@@ -355,7 +367,7 @@ static bool CreateDir2(CFSTR path)
355 IF_USE_MAIN_PATH 367 IF_USE_MAIN_PATH
356 if (::CreateDirectoryW(fs2us(path), NULL)) 368 if (::CreateDirectoryW(fs2us(path), NULL))
357 return true; 369 return true;
358 #ifdef WIN_LONG_PATH 370 #ifdef Z7_LONG_PATH
359 if ((!USE_MAIN_PATH || ::GetLastError() != ERROR_ALREADY_EXISTS) && USE_SUPER_PATH) 371 if ((!USE_MAIN_PATH || ::GetLastError() != ERROR_ALREADY_EXISTS) && USE_SUPER_PATH)
360 { 372 {
361 UString superPath; 373 UString superPath;
@@ -390,7 +402,7 @@ bool CreateComplexDir(CFSTR _path)
390 #ifdef _WIN32 402 #ifdef _WIN32
391 403
392 { 404 {
393 DWORD attrib = NFind::GetFileAttrib(_path); 405 const DWORD attrib = NFind::GetFileAttrib(_path);
394 if (attrib != INVALID_FILE_ATTRIBUTES && (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0) 406 if (attrib != INVALID_FILE_ATTRIBUTES && (attrib & FILE_ATTRIBUTE_DIRECTORY) != 0)
395 return true; 407 return true;
396 } 408 }
@@ -496,7 +508,7 @@ bool DeleteFileAlways(CFSTR path)
496 IF_USE_MAIN_PATH 508 IF_USE_MAIN_PATH
497 if (::DeleteFileW(fs2us(path))) 509 if (::DeleteFileW(fs2us(path)))
498 return true; 510 return true;
499 #ifdef WIN_LONG_PATH 511 #ifdef Z7_LONG_PATH
500 if (USE_SUPER_PATH) 512 if (USE_SUPER_PATH)
501 { 513 {
502 UString superPath; 514 UString superPath;
@@ -586,9 +598,12 @@ bool MyGetFullPathName(CFSTR path, FString &resFullPath)
586 598
587#ifdef _WIN32 599#ifdef _WIN32
588 600
601/* Win10: SetCurrentDirectory() doesn't support long paths and
602 doesn't support super prefix "\\?\", if long path behavior is not
603 enabled in registry (LongPathsEnabled) and in manifest (longPathAware). */
604
589bool SetCurrentDir(CFSTR path) 605bool SetCurrentDir(CFSTR path)
590{ 606{
591 // SetCurrentDirectory doesn't support \\?\ prefix
592 #ifndef _UNICODE 607 #ifndef _UNICODE
593 if (!g_IsNT) 608 if (!g_IsNT)
594 { 609 {
@@ -602,28 +617,74 @@ bool SetCurrentDir(CFSTR path)
602} 617}
603 618
604 619
620/*
621we use system function GetCurrentDirectory()
622new GetCurrentDirectory() DOCs:
623 - If the function fails, the return value is zero.
624 - If the function succeeds, the return value specifies
625 the number of characters that are written to the buffer,
626 not including the terminating null character.
627 - If the buffer is not large enough, the return value specifies
628 the required size of the buffer, in characters,
629 including the null-terminating character.
630
631GetCurrentDir() calls GetCurrentDirectory().
632GetCurrentDirectory() in win10 in tests:
633 the returned (path) does not end with a backslash, if
634 current directory is not root directory of drive.
635 But that behavior is not guarantied in specification docs.
636*/
637
605bool GetCurrentDir(FString &path) 638bool GetCurrentDir(FString &path)
606{ 639{
640 const unsigned kBufSize = MAX_PATH + 16;
607 path.Empty(); 641 path.Empty();
608 642
609 DWORD needLength;
610 #ifndef _UNICODE 643 #ifndef _UNICODE
611 if (!g_IsNT) 644 if (!g_IsNT)
612 { 645 {
613 TCHAR s[MAX_PATH + 2]; 646 TCHAR s[kBufSize + 1];
614 s[0] = 0; 647 s[0] = 0;
615 needLength = ::GetCurrentDirectory(MAX_PATH + 1, s); 648 const DWORD len = ::GetCurrentDirectory(kBufSize, s);
649 if (len == 0 || len >= kBufSize)
650 return false;
651 s[kBufSize] = 0; // optional guard
616 path = fas2fs(s); 652 path = fas2fs(s);
653 return true;
617 } 654 }
618 else 655 else
619 #endif 656 #endif
620 { 657 {
621 WCHAR s[MAX_PATH + 2]; 658 DWORD len;
622 s[0] = 0; 659 {
623 needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, s); 660 WCHAR s[kBufSize + 1];
624 path = us2fs(s); 661 s[0] = 0;
662 len = ::GetCurrentDirectoryW(kBufSize, s);
663 if (len == 0)
664 return false;
665 if (len < kBufSize)
666 {
667 s[kBufSize] = 0; // optional guard
668 path = us2fs(s);
669 return true;
670 }
671 }
672 UString temp;
673 const DWORD len2 = ::GetCurrentDirectoryW(len, temp.GetBuf(len));
674 if (len2 == 0)
675 return false;
676 temp.ReleaseBuf_CalcLen(len);
677 if (temp.Len() != len2 || len - 1 != len2)
678 {
679 /* it's unexpected case, if current dir of process
680 was changed between two function calls,
681 or some unexpected function implementation */
682 // SetLastError((DWORD)E_FAIL); // we can set some error code
683 return false;
684 }
685 path = us2fs(temp);
686 return true;
625 } 687 }
626 return (needLength > 0 && needLength <= MAX_PATH);
627} 688}
628 689
629#endif // _WIN32 690#endif // _WIN32
@@ -648,41 +709,59 @@ bool GetOnlyDirPrefix(CFSTR path, FString &resDirPrefix)
648 return GetFullPathAndSplit(path, resDirPrefix, resFileName); 709 return GetFullPathAndSplit(path, resDirPrefix, resFileName);
649} 710}
650 711
712
713
651bool MyGetTempPath(FString &path) 714bool MyGetTempPath(FString &path)
652{ 715{
653 #ifdef _WIN32 716 #ifdef _WIN32
654 path.Empty(); 717
655 DWORD needLength; 718 /*
719 new DOCs for GetTempPathW():
720 - The returned string ends with a backslash.
721 - The maximum possible return value is MAX_PATH+1 (261).
722 */
723
724 const unsigned kBufSize = MAX_PATH + 16;
725 DWORD len;
656 #ifndef _UNICODE 726 #ifndef _UNICODE
657 if (!g_IsNT) 727 if (!g_IsNT)
658 { 728 {
659 TCHAR s[MAX_PATH + 2]; 729 TCHAR s[kBufSize + 1];
660 s[0] = 0; 730 s[0] = 0;
661 needLength = ::GetTempPath(MAX_PATH + 1, s); 731 len = ::GetTempPath(kBufSize, s);
662 path = fas2fs(s); 732 path = fas2fs(s);
663 } 733 }
664 else 734 else
665 #endif 735 #endif
666 { 736 {
667 WCHAR s[MAX_PATH + 2]; 737 WCHAR s[kBufSize + 1];
668 s[0] = 0; 738 s[0] = 0;
669 needLength = ::GetTempPathW(MAX_PATH + 1, s);; 739 len = ::GetTempPathW(kBufSize, s);
670 path = us2fs(s); 740 path = us2fs(s);
671 } 741 }
672 return (needLength > 0 && needLength <= MAX_PATH); 742 /* win10: GetTempPathW() doesn't set backslash at the end of path,
743 if (buffer_size == len_of(path_with_backslash)).
744 So we normalize path here: */
745 NormalizeDirPathPrefix(path);
746 return (len != 0 && len < kBufSize);
673 747
674 #else 748 #else // !_WIN32
675 749
676 // FIXME: improve that code 750 // FIXME: improve that code
677 path = "/tmp/"; 751 path = STRING_PATH_SEPARATOR "tmp";
678 if (!NFind::DoesDirExist_FollowLink(path)) 752 const char *s;
679 path = "./"; 753 if (NFind::DoesDirExist_FollowLink(path))
754 s = STRING_PATH_SEPARATOR "tmp" STRING_PATH_SEPARATOR;
755 else
756 s = "." STRING_PATH_SEPARATOR;
757 path = s;
680 return true; 758 return true;
759
681 #endif 760 #endif
682} 761}
683 762
684 763
685static bool CreateTempFile(CFSTR prefix, bool addRandom, FString &path, NIO::COutFile *outFile) 764bool CreateTempFile2(CFSTR prefix, bool addRandom, AString &postfix, NIO::COutFile *outFile)
686{ 765{
687 UInt32 d = 766 UInt32 d =
688 #ifdef _WIN32 767 #ifdef _WIN32
@@ -693,7 +772,7 @@ static bool CreateTempFile(CFSTR prefix, bool addRandom, FString &path, NIO::COu
693 772
694 for (unsigned i = 0; i < 100; i++) 773 for (unsigned i = 0; i < 100; i++)
695 { 774 {
696 path = prefix; 775 postfix.Empty();
697 if (addRandom) 776 if (addRandom)
698 { 777 {
699 char s[16]; 778 char s[16];
@@ -701,14 +780,14 @@ static bool CreateTempFile(CFSTR prefix, bool addRandom, FString &path, NIO::COu
701 unsigned k; 780 unsigned k;
702 for (k = 0; k < 8; k++) 781 for (k = 0; k < 8; k++)
703 { 782 {
704 unsigned t = val & 0xF; 783 const unsigned t = val & 0xF;
705 val >>= 4; 784 val >>= 4;
706 s[k] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10))); 785 s[k] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
707 } 786 }
708 s[k] = '\0'; 787 s[k] = '\0';
709 if (outFile) 788 if (outFile)
710 path += '.'; 789 postfix.Add_Dot();
711 path += s; 790 postfix += s;
712 UInt32 step = GetTickCount() + 2; 791 UInt32 step = GetTickCount() + 2;
713 if (step == 0) 792 if (step == 0)
714 step = 1; 793 step = 1;
@@ -716,7 +795,9 @@ static bool CreateTempFile(CFSTR prefix, bool addRandom, FString &path, NIO::COu
716 } 795 }
717 addRandom = true; 796 addRandom = true;
718 if (outFile) 797 if (outFile)
719 path += ".tmp"; 798 postfix += ".tmp";
799 FString path (prefix);
800 path += postfix;
720 if (NFind::DoesFileOrDirExist(path)) 801 if (NFind::DoesFileOrDirExist(path))
721 { 802 {
722 SetLastError(ERROR_ALREADY_EXISTS); 803 SetLastError(ERROR_ALREADY_EXISTS);
@@ -732,12 +813,12 @@ static bool CreateTempFile(CFSTR prefix, bool addRandom, FString &path, NIO::COu
732 if (CreateDir(path)) 813 if (CreateDir(path))
733 return true; 814 return true;
734 } 815 }
735 DWORD error = GetLastError(); 816 const DWORD error = GetLastError();
736 if (error != ERROR_FILE_EXISTS && 817 if (error != ERROR_FILE_EXISTS &&
737 error != ERROR_ALREADY_EXISTS) 818 error != ERROR_ALREADY_EXISTS)
738 break; 819 break;
739 } 820 }
740 path.Empty(); 821 postfix.Empty();
741 return false; 822 return false;
742} 823}
743 824
@@ -745,8 +826,12 @@ bool CTempFile::Create(CFSTR prefix, NIO::COutFile *outFile)
745{ 826{
746 if (!Remove()) 827 if (!Remove())
747 return false; 828 return false;
748 if (!CreateTempFile(prefix, false, _path, outFile)) 829 _path.Empty();
830 AString postfix;
831 if (!CreateTempFile2(prefix, false, postfix, outFile))
749 return false; 832 return false;
833 _path = prefix;
834 _path += postfix;
750 _mustBeDeleted = true; 835 _mustBeDeleted = true;
751 return true; 836 return true;
752} 837}
@@ -755,11 +840,16 @@ bool CTempFile::CreateRandomInTempFolder(CFSTR namePrefix, NIO::COutFile *outFil
755{ 840{
756 if (!Remove()) 841 if (!Remove())
757 return false; 842 return false;
843 _path.Empty();
758 FString tempPath; 844 FString tempPath;
759 if (!MyGetTempPath(tempPath)) 845 if (!MyGetTempPath(tempPath))
760 return false; 846 return false;
761 if (!CreateTempFile(tempPath + namePrefix, true, _path, outFile)) 847 AString postfix;
848 tempPath += namePrefix;
849 if (!CreateTempFile2(tempPath, true, postfix, outFile))
762 return false; 850 return false;
851 _path = tempPath;
852 _path += postfix;
763 _mustBeDeleted = true; 853 _mustBeDeleted = true;
764 return true; 854 return true;
765} 855}
@@ -802,11 +892,16 @@ bool CTempDir::Create(CFSTR prefix)
802{ 892{
803 if (!Remove()) 893 if (!Remove())
804 return false; 894 return false;
895 _path.Empty();
805 FString tempPath; 896 FString tempPath;
806 if (!MyGetTempPath(tempPath)) 897 if (!MyGetTempPath(tempPath))
807 return false; 898 return false;
808 if (!CreateTempFile(tempPath + prefix, true, _path, NULL)) 899 tempPath += prefix;
900 AString postfix;
901 if (!CreateTempFile2(tempPath, true, postfix, NULL))
809 return false; 902 return false;
903 _path = tempPath;
904 _path += postfix;
810 _mustBeDeleted = true; 905 _mustBeDeleted = true;
811 return true; 906 return true;
812} 907}
@@ -830,7 +925,7 @@ bool RemoveDir(CFSTR path)
830} 925}
831 926
832 927
833static BOOL My__CopyFile(CFSTR oldFile, CFSTR newFile) 928static BOOL My_CopyFile(CFSTR oldFile, CFSTR newFile)
834{ 929{
835 NWindows::NFile::NIO::COutFile outFile; 930 NWindows::NFile::NIO::COutFile outFile;
836 if (!outFile.Create(newFile, false)) 931 if (!outFile.Create(newFile, false))
@@ -865,7 +960,7 @@ bool MyMoveFile(CFSTR oldFile, CFSTR newFile)
865 if (errno != EXDEV) // (oldFile and newFile are not on the same mounted filesystem) 960 if (errno != EXDEV) // (oldFile and newFile are not on the same mounted filesystem)
866 return false; 961 return false;
867 962
868 if (My__CopyFile(oldFile, newFile) == FALSE) 963 if (My_CopyFile(oldFile, newFile) == FALSE)
869 return false; 964 return false;
870 965
871 struct stat info_file; 966 struct stat info_file;
@@ -906,11 +1001,11 @@ bool GetCurrentDir(FString &path)
906{ 1001{
907 path.Empty(); 1002 path.Empty();
908 1003
909 #define MY__PATH_MAX PATH_MAX 1004 #define MY_PATH_MAX PATH_MAX
910 // #define MY__PATH_MAX 1024 1005 // #define MY_PATH_MAX 1024
911 1006
912 char s[MY__PATH_MAX + 1]; 1007 char s[MY_PATH_MAX + 1];
913 char *res = getcwd(s, MY__PATH_MAX); 1008 char *res = getcwd(s, MY_PATH_MAX);
914 if (res) 1009 if (res)
915 { 1010 {
916 path = fas2fs(s); 1011 path = fas2fs(s);
@@ -1035,10 +1130,10 @@ static C_umask g_umask;
1035#define PRF(x) 1130#define PRF(x)
1036 1131
1037#define TRACE_SetFileAttrib(msg) \ 1132#define TRACE_SetFileAttrib(msg) \
1038 PRF(printf("\nSetFileAttrib(%s, %x) : %s\n", (const char *)path, attrib, msg)); 1133 PRF(printf("\nSetFileAttrib(%s, %x) : %s\n", (const char *)path, attrib, msg);)
1039 1134
1040#define TRACE_chmod(s, mode) \ 1135#define TRACE_chmod(s, mode) \
1041 PRF(printf("\n chmod(%s, %o)\n", (const char *)path, (unsigned)(mode))); 1136 PRF(printf("\n chmod(%s, %o)\n", (const char *)path, (unsigned)(mode));)
1042 1137
1043int my_chown(CFSTR path, uid_t owner, gid_t group) 1138int my_chown(CFSTR path, uid_t owner, gid_t group)
1044{ 1139{
@@ -1047,7 +1142,7 @@ int my_chown(CFSTR path, uid_t owner, gid_t group)
1047 1142
1048bool SetFileAttrib_PosixHighDetect(CFSTR path, DWORD attrib) 1143bool SetFileAttrib_PosixHighDetect(CFSTR path, DWORD attrib)
1049{ 1144{
1050 TRACE_SetFileAttrib(""); 1145 TRACE_SetFileAttrib("")
1051 1146
1052 struct stat st; 1147 struct stat st;
1053 1148
@@ -1056,7 +1151,7 @@ bool SetFileAttrib_PosixHighDetect(CFSTR path, DWORD attrib)
1056 { 1151 {
1057 if (lstat(path, &st) != 0) 1152 if (lstat(path, &st) != 0)
1058 { 1153 {
1059 TRACE_SetFileAttrib("bad lstat()"); 1154 TRACE_SetFileAttrib("bad lstat()")
1060 return false; 1155 return false;
1061 } 1156 }
1062 // TRACE_chmod("lstat", st.st_mode); 1157 // TRACE_chmod("lstat", st.st_mode);
@@ -1065,14 +1160,14 @@ bool SetFileAttrib_PosixHighDetect(CFSTR path, DWORD attrib)
1065 { 1160 {
1066 if (stat(path, &st) != 0) 1161 if (stat(path, &st) != 0)
1067 { 1162 {
1068 TRACE_SetFileAttrib("bad stat()"); 1163 TRACE_SetFileAttrib("bad stat()")
1069 return false; 1164 return false;
1070 } 1165 }
1071 } 1166 }
1072 1167
1073 if (attrib & FILE_ATTRIBUTE_UNIX_EXTENSION) 1168 if (attrib & FILE_ATTRIBUTE_UNIX_EXTENSION)
1074 { 1169 {
1075 TRACE_SetFileAttrib("attrib & FILE_ATTRIBUTE_UNIX_EXTENSION"); 1170 TRACE_SetFileAttrib("attrib & FILE_ATTRIBUTE_UNIX_EXTENSION")
1076 st.st_mode = attrib >> 16; 1171 st.st_mode = attrib >> 16;
1077 if (S_ISDIR(st.st_mode)) 1172 if (S_ISDIR(st.st_mode))
1078 { 1173 {
@@ -1092,7 +1187,7 @@ bool SetFileAttrib_PosixHighDetect(CFSTR path, DWORD attrib)
1092 } 1187 }
1093 else 1188 else
1094 { 1189 {
1095 TRACE_SetFileAttrib("Only Windows Attributes"); 1190 TRACE_SetFileAttrib("Only Windows Attributes")
1096 // Only Windows Attributes 1191 // Only Windows Attributes
1097 if (S_ISDIR(st.st_mode) 1192 if (S_ISDIR(st.st_mode)
1098 || (attrib & FILE_ATTRIBUTE_READONLY) == 0) 1193 || (attrib & FILE_ATTRIBUTE_READONLY) == 0)
@@ -1105,7 +1200,7 @@ bool SetFileAttrib_PosixHighDetect(CFSTR path, DWORD attrib)
1105 if (S_ISLNK(st.st_mode)) 1200 if (S_ISLNK(st.st_mode))
1106 { 1201 {
1107 printf("\nfchmodat()\n"); 1202 printf("\nfchmodat()\n");
1108 TRACE_chmod(path, (st.st_mode) & g_umask.mask); 1203 TRACE_chmod(path, (st.st_mode) & g_umask.mask)
1109 // AT_SYMLINK_NOFOLLOW is not implemted still in Linux. 1204 // AT_SYMLINK_NOFOLLOW is not implemted still in Linux.
1110 res = fchmodat(AT_FDCWD, path, (st.st_mode) & g_umask.mask, 1205 res = fchmodat(AT_FDCWD, path, (st.st_mode) & g_umask.mask,
1111 S_ISLNK(st.st_mode) ? AT_SYMLINK_NOFOLLOW : 0); 1206 S_ISLNK(st.st_mode) ? AT_SYMLINK_NOFOLLOW : 0);
@@ -1113,7 +1208,7 @@ bool SetFileAttrib_PosixHighDetect(CFSTR path, DWORD attrib)
1113 else 1208 else
1114 */ 1209 */
1115 { 1210 {
1116 TRACE_chmod(path, (st.st_mode) & g_umask.mask); 1211 TRACE_chmod(path, (st.st_mode) & g_umask.mask)
1117 res = chmod(path, (st.st_mode) & g_umask.mask); 1212 res = chmod(path, (st.st_mode) & g_umask.mask);
1118 } 1213 }
1119 // TRACE_SetFileAttrib("End") 1214 // TRACE_SetFileAttrib("End")
@@ -1123,7 +1218,7 @@ bool SetFileAttrib_PosixHighDetect(CFSTR path, DWORD attrib)
1123 1218
1124bool MyCreateHardLink(CFSTR newFileName, CFSTR existFileName) 1219bool MyCreateHardLink(CFSTR newFileName, CFSTR existFileName)
1125{ 1220{
1126 PRF(printf("\nhard link() %s -> %s\n", newFileName, existFileName)); 1221 PRF(printf("\nhard link() %s -> %s\n", newFileName, existFileName);)
1127 return (link(existFileName, newFileName) == 0); 1222 return (link(existFileName, newFileName) == 0);
1128} 1223}
1129 1224
diff --git a/CPP/Windows/FileDir.h b/CPP/Windows/FileDir.h
index 08281aa..573ffa2 100644
--- a/CPP/Windows/FileDir.h
+++ b/CPP/Windows/FileDir.h
@@ -1,7 +1,7 @@
1// Windows/FileDir.h 1// Windows/FileDir.h
2 2
3#ifndef __WINDOWS_FILE_DIR_H 3#ifndef ZIP7_INC_WINDOWS_FILE_DIR_H
4#define __WINDOWS_FILE_DIR_H 4#define ZIP7_INC_WINDOWS_FILE_DIR_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7 7
@@ -73,6 +73,8 @@ bool GetCurrentDir(FString &resultPath);
73 73
74bool MyGetTempPath(FString &resultPath); 74bool MyGetTempPath(FString &resultPath);
75 75
76bool CreateTempFile2(CFSTR prefix, bool addRandom, AString &postfix, NIO::COutFile *outFile);
77
76class CTempFile MY_UNCOPYABLE 78class CTempFile MY_UNCOPYABLE
77{ 79{
78 bool _mustBeDeleted; 80 bool _mustBeDeleted;
diff --git a/CPP/Windows/FileFind.cpp b/CPP/Windows/FileFind.cpp
index c655759..c562a90 100644
--- a/CPP/Windows/FileFind.cpp
+++ b/CPP/Windows/FileFind.cpp
@@ -39,10 +39,10 @@ typedef struct
39 WCHAR cStreamName[MAX_PATH + 36]; 39 WCHAR cStreamName[MAX_PATH + 36];
40} MY_WIN32_FIND_STREAM_DATA, *MY_PWIN32_FIND_STREAM_DATA; 40} MY_WIN32_FIND_STREAM_DATA, *MY_PWIN32_FIND_STREAM_DATA;
41 41
42typedef HANDLE (WINAPI *FindFirstStreamW_Ptr)(LPCWSTR fileName, MY_STREAM_INFO_LEVELS infoLevel, 42typedef HANDLE (WINAPI *Func_FindFirstStreamW)(LPCWSTR fileName, MY_STREAM_INFO_LEVELS infoLevel,
43 LPVOID findStreamData, DWORD flags); 43 LPVOID findStreamData, DWORD flags);
44 44
45typedef BOOL (APIENTRY *FindNextStreamW_Ptr)(HANDLE findStream, LPVOID findStreamData); 45typedef BOOL (APIENTRY *Func_FindNextStreamW)(HANDLE findStream, LPVOID findStreamData);
46 46
47EXTERN_C_END 47EXTERN_C_END
48 48
@@ -54,7 +54,7 @@ namespace NFile {
54 54
55 55
56#ifdef _WIN32 56#ifdef _WIN32
57#ifdef SUPPORT_DEVICE_FILE 57#ifdef Z7_DEVICE_FILE
58namespace NSystem 58namespace NSystem
59{ 59{
60bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize); 60bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize);
@@ -128,7 +128,7 @@ bool CFileInfo::IsDots() const throw()
128 128
129static void Convert_WIN32_FIND_DATA_to_FileInfo(const WIN32_FIND_DATAW &fd, CFileInfo &fi) 129static void Convert_WIN32_FIND_DATA_to_FileInfo(const WIN32_FIND_DATAW &fd, CFileInfo &fi)
130{ 130{
131 WIN_FD_TO_MY_FI(fi, fd); 131 WIN_FD_TO_MY_FI(fi, fd)
132 fi.Name = us2fs(fd.cFileName); 132 fi.Name = us2fs(fd.cFileName);
133 #if defined(_WIN32) && !defined(UNDER_CE) 133 #if defined(_WIN32) && !defined(UNDER_CE)
134 // fi.ShortName = us2fs(fd.cAlternateFileName); 134 // fi.ShortName = us2fs(fd.cAlternateFileName);
@@ -138,7 +138,7 @@ static void Convert_WIN32_FIND_DATA_to_FileInfo(const WIN32_FIND_DATAW &fd, CFil
138#ifndef _UNICODE 138#ifndef _UNICODE
139static void Convert_WIN32_FIND_DATA_to_FileInfo(const WIN32_FIND_DATA &fd, CFileInfo &fi) 139static void Convert_WIN32_FIND_DATA_to_FileInfo(const WIN32_FIND_DATA &fd, CFileInfo &fi)
140{ 140{
141 WIN_FD_TO_MY_FI(fi, fd); 141 WIN_FD_TO_MY_FI(fi, fd)
142 fi.Name = fas2fs(fd.cFileName); 142 fi.Name = fas2fs(fd.cFileName);
143 #if defined(_WIN32) && !defined(UNDER_CE) 143 #if defined(_WIN32) && !defined(UNDER_CE)
144 // fi.ShortName = fas2fs(fd.cAlternateFileName); 144 // fi.ShortName = fas2fs(fd.cAlternateFileName);
@@ -211,7 +211,7 @@ bool CFindFile::FindFirst(CFSTR path, CFileInfo &fi)
211 211
212 IF_USE_MAIN_PATH 212 IF_USE_MAIN_PATH
213 _handle = ::FindFirstFileW(fs2us(path), &fd); 213 _handle = ::FindFirstFileW(fs2us(path), &fd);
214 #ifdef WIN_LONG_PATH 214 #ifdef Z7_LONG_PATH
215 if (_handle == INVALID_HANDLE_VALUE && USE_SUPER_PATH) 215 if (_handle == INVALID_HANDLE_VALUE && USE_SUPER_PATH)
216 { 216 {
217 UString superPath; 217 UString superPath;
@@ -252,23 +252,27 @@ bool CFindFile::FindNext(CFileInfo &fi)
252//////////////////////////////// 252////////////////////////////////
253// AltStreams 253// AltStreams
254 254
255static FindFirstStreamW_Ptr g_FindFirstStreamW; 255static Func_FindFirstStreamW g_FindFirstStreamW;
256static FindNextStreamW_Ptr g_FindNextStreamW; 256static Func_FindNextStreamW g_FindNextStreamW;
257 257
258static struct CFindStreamLoader 258static struct CFindStreamLoader
259{ 259{
260 CFindStreamLoader() 260 CFindStreamLoader()
261 { 261 {
262 HMODULE hm = ::GetModuleHandleA("kernel32.dll"); 262 const HMODULE hm = ::GetModuleHandleA("kernel32.dll");
263 g_FindFirstStreamW = (FindFirstStreamW_Ptr)(void *)::GetProcAddress(hm, "FindFirstStreamW"); 263 g_FindFirstStreamW = Z7_GET_PROC_ADDRESS(
264 g_FindNextStreamW = (FindNextStreamW_Ptr)(void *)::GetProcAddress(hm, "FindNextStreamW"); 264 Func_FindFirstStreamW, hm,
265 "FindFirstStreamW");
266 g_FindNextStreamW = Z7_GET_PROC_ADDRESS(
267 Func_FindNextStreamW, hm,
268 "FindNextStreamW");
265 } 269 }
266} g_FindStreamLoader; 270} g_FindStreamLoader;
267 271
268bool CStreamInfo::IsMainStream() const throw() 272bool CStreamInfo::IsMainStream() const throw()
269{ 273{
270 return StringsAreEqualNoCase_Ascii(Name, "::$DATA"); 274 return StringsAreEqualNoCase_Ascii(Name, "::$DATA");
271}; 275}
272 276
273UString CStreamInfo::GetReducedName() const 277UString CStreamInfo::GetReducedName() const
274{ 278{
@@ -331,7 +335,7 @@ bool CFindStream::FindFirst(CFSTR path, CStreamInfo &si)
331 if (::GetLastError() == ERROR_HANDLE_EOF) 335 if (::GetLastError() == ERROR_HANDLE_EOF)
332 return false; 336 return false;
333 // long name can be tricky for path like ".\dirName". 337 // long name can be tricky for path like ".\dirName".
334 #ifdef WIN_LONG_PATH 338 #ifdef Z7_LONG_PATH
335 if (USE_SUPER_PATH) 339 if (USE_SUPER_PATH)
336 { 340 {
337 UString superPath; 341 UString superPath;
@@ -414,7 +418,7 @@ DWORD GetFileAttrib(CFSTR path)
414 if (dw != INVALID_FILE_ATTRIBUTES) 418 if (dw != INVALID_FILE_ATTRIBUTES)
415 return dw; 419 return dw;
416 } 420 }
417 #ifdef WIN_LONG_PATH 421 #ifdef Z7_LONG_PATH
418 if (USE_SUPER_PATH) 422 if (USE_SUPER_PATH)
419 { 423 {
420 UString superPath; 424 UString superPath;
@@ -451,7 +455,7 @@ also we support paths that are not supported by FindFirstFile:
451 455
452bool CFileInfo::Find(CFSTR path, bool followLink) 456bool CFileInfo::Find(CFSTR path, bool followLink)
453{ 457{
454 #ifdef SUPPORT_DEVICE_FILE 458 #ifdef Z7_DEVICE_FILE
455 459
456 if (IS_PATH_SEPAR(path[0]) && 460 if (IS_PATH_SEPAR(path[0]) &&
457 IS_PATH_SEPAR(path[1]) && 461 IS_PATH_SEPAR(path[1]) &&
@@ -847,7 +851,7 @@ HANDLE CFindChangeNotification::FindFirst(CFSTR path, bool watchSubtree, DWORD n
847 { 851 {
848 IF_USE_MAIN_PATH 852 IF_USE_MAIN_PATH
849 _handle = ::FindFirstChangeNotificationW(fs2us(path), BoolToBOOL(watchSubtree), notifyFilter); 853 _handle = ::FindFirstChangeNotificationW(fs2us(path), BoolToBOOL(watchSubtree), notifyFilter);
850 #ifdef WIN_LONG_PATH 854 #ifdef Z7_LONG_PATH
851 if (!IsHandleAllocated()) 855 if (!IsHandleAllocated())
852 { 856 {
853 UString superPath; 857 UString superPath;
diff --git a/CPP/Windows/FileFind.h b/CPP/Windows/FileFind.h
index fcfe02c..11408d0 100644
--- a/CPP/Windows/FileFind.h
+++ b/CPP/Windows/FileFind.h
@@ -1,7 +1,7 @@
1// Windows/FileFind.h 1// Windows/FileFind.h
2 2
3#ifndef __WINDOWS_FILE_FIND_H 3#ifndef ZIP7_INC_WINDOWS_FILE_FIND_H
4#define __WINDOWS_FILE_FIND_H 4#define ZIP7_INC_WINDOWS_FILE_FIND_H
5 5
6#ifndef _WIN32 6#ifndef _WIN32
7#include <sys/stat.h> 7#include <sys/stat.h>
@@ -249,7 +249,15 @@ class CFindChangeNotification MY_UNCOPYABLE
249 HANDLE _handle; 249 HANDLE _handle;
250public: 250public:
251 operator HANDLE () { return _handle; } 251 operator HANDLE () { return _handle; }
252 bool IsHandleAllocated() const { return _handle != INVALID_HANDLE_VALUE && _handle != 0; } 252 bool IsHandleAllocated() const
253 {
254 /* at least on win2000/XP (undocumented):
255 if pathName is "" or NULL,
256 FindFirstChangeNotification() could return NULL.
257 So we check for INVALID_HANDLE_VALUE and NULL.
258 */
259 return _handle != INVALID_HANDLE_VALUE && _handle != NULL;
260 }
253 CFindChangeNotification(): _handle(INVALID_HANDLE_VALUE) {} 261 CFindChangeNotification(): _handle(INVALID_HANDLE_VALUE) {}
254 ~CFindChangeNotification() { Close(); } 262 ~CFindChangeNotification() { Close(); }
255 bool Close() throw(); 263 bool Close() throw();
diff --git a/CPP/Windows/FileIO.cpp b/CPP/Windows/FileIO.cpp
index e51b0eb..4ecbb7e 100644
--- a/CPP/Windows/FileIO.cpp
+++ b/CPP/Windows/FileIO.cpp
@@ -2,7 +2,7 @@
2 2
3#include "StdAfx.h" 3#include "StdAfx.h"
4 4
5#ifdef SUPPORT_DEVICE_FILE 5#ifdef Z7_DEVICE_FILE
6#include "../../C/Alloc.h" 6#include "../../C/Alloc.h"
7#endif 7#endif
8 8
@@ -21,7 +21,7 @@
21 21
22HRESULT GetLastError_noZero_HRESULT() 22HRESULT GetLastError_noZero_HRESULT()
23{ 23{
24 DWORD res = ::GetLastError(); 24 const DWORD res = ::GetLastError();
25 if (res == 0) 25 if (res == 0)
26 return E_FAIL; 26 return E_FAIL;
27 return HRESULT_FROM_WIN32(res); 27 return HRESULT_FROM_WIN32(res);
@@ -40,7 +40,7 @@ using namespace NName;
40namespace NWindows { 40namespace NWindows {
41namespace NFile { 41namespace NFile {
42 42
43#ifdef SUPPORT_DEVICE_FILE 43#ifdef Z7_DEVICE_FILE
44 44
45namespace NSystem 45namespace NSystem
46{ 46{
@@ -72,7 +72,7 @@ bool CFileBase::Create(CFSTR path, DWORD desiredAccess,
72 if (!Close()) 72 if (!Close())
73 return false; 73 return false;
74 74
75 #ifdef SUPPORT_DEVICE_FILE 75 #ifdef Z7_DEVICE_FILE
76 IsDeviceFile = false; 76 IsDeviceFile = false;
77 #endif 77 #endif
78 78
@@ -88,7 +88,7 @@ bool CFileBase::Create(CFSTR path, DWORD desiredAccess,
88 IF_USE_MAIN_PATH 88 IF_USE_MAIN_PATH
89 _handle = ::CreateFileW(fs2us(path), desiredAccess, shareMode, 89 _handle = ::CreateFileW(fs2us(path), desiredAccess, shareMode,
90 (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL); 90 (LPSECURITY_ATTRIBUTES)NULL, creationDisposition, flagsAndAttributes, (HANDLE)NULL);
91 #ifdef WIN_LONG_PATH 91 #ifdef Z7_LONG_PATH
92 if (_handle == INVALID_HANDLE_VALUE && USE_SUPER_PATH) 92 if (_handle == INVALID_HANDLE_VALUE && USE_SUPER_PATH)
93 { 93 {
94 UString superPath; 94 UString superPath;
@@ -101,7 +101,7 @@ bool CFileBase::Create(CFSTR path, DWORD desiredAccess,
101 101
102 /* 102 /*
103 #ifndef UNDER_CE 103 #ifndef UNDER_CE
104 #ifndef _SFX 104 #ifndef Z7_SFX
105 if (_handle == INVALID_HANDLE_VALUE) 105 if (_handle == INVALID_HANDLE_VALUE)
106 { 106 {
107 // it's debug hack to open symbolic links in Windows XP and WSL links in Windows 10 107 // it's debug hack to open symbolic links in Windows XP and WSL links in Windows 10
@@ -149,7 +149,7 @@ bool CFileBase::Close() throw()
149 149
150bool CFileBase::GetLength(UInt64 &length) const throw() 150bool CFileBase::GetLength(UInt64 &length) const throw()
151{ 151{
152 #ifdef SUPPORT_DEVICE_FILE 152 #ifdef Z7_DEVICE_FILE
153 if (IsDeviceFile && SizeDefined) 153 if (IsDeviceFile && SizeDefined)
154 { 154 {
155 length = Size; 155 length = Size;
@@ -219,7 +219,7 @@ bool CFileBase::GetPosition(UInt64 &position) const throw()
219 219
220bool CFileBase::Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const throw() 220bool CFileBase::Seek(Int64 distanceToMove, DWORD moveMethod, UInt64 &newPosition) const throw()
221{ 221{
222 #ifdef SUPPORT_DEVICE_FILE 222 #ifdef Z7_DEVICE_FILE
223 if (IsDeviceFile && SizeDefined && moveMethod == FILE_END) 223 if (IsDeviceFile && SizeDefined && moveMethod == FILE_END)
224 { 224 {
225 distanceToMove += Size; 225 distanceToMove += Size;
@@ -262,12 +262,12 @@ bool CFileBase::SeekToEnd(UInt64 &newPosition) const throw()
262 262
263// ---------- CInFile --------- 263// ---------- CInFile ---------
264 264
265#ifdef SUPPORT_DEVICE_FILE 265#ifdef Z7_DEVICE_FILE
266 266
267void CInFile::CorrectDeviceSize() 267void CInFile::CorrectDeviceSize()
268{ 268{
269 // maybe we must decrease kClusterSize to 1 << 12, if we want correct size at tail 269 // maybe we must decrease kClusterSize to 1 << 12, if we want correct size at tail
270 static const UInt32 kClusterSize = 1 << 14; 270 const UInt32 kClusterSize = 1 << 14;
271 UInt64 pos = Size & ~(UInt64)(kClusterSize - 1); 271 UInt64 pos = Size & ~(UInt64)(kClusterSize - 1);
272 UInt64 realNewPosition; 272 UInt64 realNewPosition;
273 if (!Seek(pos, realNewPosition)) 273 if (!Seek(pos, realNewPosition))
@@ -462,7 +462,7 @@ static const UInt32 kChunkSizeMax = (1 << 22);
462bool CInFile::Read1(void *data, UInt32 size, UInt32 &processedSize) throw() 462bool CInFile::Read1(void *data, UInt32 size, UInt32 &processedSize) throw()
463{ 463{
464 DWORD processedLoc = 0; 464 DWORD processedLoc = 0;
465 bool res = BOOLToBool(::ReadFile(_handle, data, size, &processedLoc, NULL)); 465 const bool res = BOOLToBool(::ReadFile(_handle, data, size, &processedLoc, NULL));
466 processedSize = (UInt32)processedLoc; 466 processedSize = (UInt32)processedLoc;
467 return res; 467 return res;
468} 468}
@@ -480,7 +480,7 @@ bool CInFile::Read(void *data, UInt32 size, UInt32 &processedSize) throw()
480 do 480 do
481 { 481 {
482 UInt32 processedLoc = 0; 482 UInt32 processedLoc = 0;
483 bool res = ReadPart(data, size, processedLoc); 483 const bool res = ReadPart(data, size, processedLoc);
484 processedSize += processedLoc; 484 processedSize += processedLoc;
485 if (!res) 485 if (!res)
486 return false; 486 return false;
@@ -551,7 +551,7 @@ bool COutFile::Write(const void *data, UInt32 size, UInt32 &processedSize) throw
551 do 551 do
552 { 552 {
553 UInt32 processedLoc = 0; 553 UInt32 processedLoc = 0;
554 bool res = WritePart(data, size, processedLoc); 554 const bool res = WritePart(data, size, processedLoc);
555 processedSize += processedLoc; 555 processedSize += processedLoc;
556 if (!res) 556 if (!res)
557 return false; 557 return false;
@@ -628,14 +628,14 @@ bool SetDirTime(CFSTR path, const CFiTime *cTime, const CFiTime *aTime, const CF
628 628
629namespace NIO { 629namespace NIO {
630 630
631bool CFileBase::OpenBinary(const char *name, int flags) 631bool CFileBase::OpenBinary(const char *name, int flags, mode_t mode)
632{ 632{
633 #ifdef O_BINARY 633 #ifdef O_BINARY
634 flags |= O_BINARY; 634 flags |= O_BINARY;
635 #endif 635 #endif
636 636
637 Close(); 637 Close();
638 _handle = ::open(name, flags, 0666); 638 _handle = ::open(name, flags, mode);
639 return _handle != -1; 639 return _handle != -1;
640 640
641 /* 641 /*
@@ -804,10 +804,10 @@ bool COutFile::Create(const char *name, bool createAlways)
804 if (createAlways) 804 if (createAlways)
805 { 805 {
806 Close(); 806 Close();
807 _handle = ::creat(name, 0666); 807 _handle = ::creat(name, mode_for_Create);
808 return _handle != -1; 808 return _handle != -1;
809 } 809 }
810 return OpenBinary(name, O_CREAT | O_EXCL | O_WRONLY); 810 return OpenBinary(name, O_CREAT | O_EXCL | O_WRONLY, mode_for_Create);
811} 811}
812 812
813bool COutFile::Open(const char *name, DWORD creationDisposition) 813bool COutFile::Open(const char *name, DWORD creationDisposition)
@@ -850,13 +850,13 @@ bool COutFile::SetLength(UInt64 length) throw()
850 return false; 850 return false;
851 } 851 }
852 // The value of the seek pointer shall not be modified by a call to ftruncate(). 852 // The value of the seek pointer shall not be modified by a call to ftruncate().
853 int iret = ftruncate(_handle, len2); 853 const int iret = ftruncate(_handle, len2);
854 return (iret == 0); 854 return (iret == 0);
855} 855}
856 856
857bool COutFile::Close() 857bool COutFile::Close()
858{ 858{
859 bool res = CFileBase::Close(); 859 const bool res = CFileBase::Close();
860 if (!res) 860 if (!res)
861 return res; 861 return res;
862 if (CTime_defined || ATime_defined || MTime_defined) 862 if (CTime_defined || ATime_defined || MTime_defined)
diff --git a/CPP/Windows/FileIO.h b/CPP/Windows/FileIO.h
index 8050965..03e061a 100644
--- a/CPP/Windows/FileIO.h
+++ b/CPP/Windows/FileIO.h
@@ -1,23 +1,23 @@
1// Windows/FileIO.h 1// Windows/FileIO.h
2 2
3#ifndef __WINDOWS_FILE_IO_H 3#ifndef ZIP7_INC_WINDOWS_FILE_IO_H
4#define __WINDOWS_FILE_IO_H 4#define ZIP7_INC_WINDOWS_FILE_IO_H
5 5
6#include "../Common/MyWindows.h" 6#include "../Common/MyWindows.h"
7 7
8#define _my_IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L) 8#define Z7_WIN_IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
9#define _my_IO_REPARSE_TAG_SYMLINK (0xA000000CL) 9#define Z7_WIN_IO_REPARSE_TAG_SYMLINK (0xA000000CL)
10#define _my_IO_REPARSE_TAG_LX_SYMLINK (0xA000001DL) 10#define Z7_WIN_IO_REPARSE_TAG_LX_SYMLINK (0xA000001DL)
11 11
12#define _my_SYMLINK_FLAG_RELATIVE 1 12#define Z7_WIN_SYMLINK_FLAG_RELATIVE 1
13 13
14// what the meaning of that FLAG or field (2)? 14// what the meaning of that FLAG or field (2)?
15#define _my_LX_SYMLINK_FLAG 2 15#define Z7_WIN_LX_SYMLINK_FLAG 2
16 16
17#ifdef _WIN32 17#ifdef _WIN32
18 18
19#if defined(_WIN32) && !defined(UNDER_CE) 19#if defined(_WIN32) && !defined(UNDER_CE)
20#include <WinIoCtl.h> 20#include <winioctl.h>
21#endif 21#endif
22 22
23#else 23#else
@@ -76,11 +76,11 @@ struct CReparseAttr
76 // returns (false) and (ErrorCode = ERROR_REPARSE_TAG_INVALID), if unknown tag 76 // returns (false) and (ErrorCode = ERROR_REPARSE_TAG_INVALID), if unknown tag
77 bool Parse(const Byte *p, size_t size); 77 bool Parse(const Byte *p, size_t size);
78 78
79 bool IsMountPoint() const { return Tag == _my_IO_REPARSE_TAG_MOUNT_POINT; } // it's Junction 79 bool IsMountPoint() const { return Tag == Z7_WIN_IO_REPARSE_TAG_MOUNT_POINT; } // it's Junction
80 bool IsSymLink_Win() const { return Tag == _my_IO_REPARSE_TAG_SYMLINK; } 80 bool IsSymLink_Win() const { return Tag == Z7_WIN_IO_REPARSE_TAG_SYMLINK; }
81 bool IsSymLink_WSL() const { return Tag == _my_IO_REPARSE_TAG_LX_SYMLINK; } 81 bool IsSymLink_WSL() const { return Tag == Z7_WIN_IO_REPARSE_TAG_LX_SYMLINK; }
82 82
83 bool IsRelative_Win() const { return Flags == _my_SYMLINK_FLAG_RELATIVE; } 83 bool IsRelative_Win() const { return Flags == Z7_WIN_SYMLINK_FLAG_RELATIVE; }
84 84
85 bool IsRelative_WSL() const 85 bool IsRelative_WSL() const
86 { 86 {
@@ -141,17 +141,19 @@ public:
141 141
142public: 142public:
143 bool PreserveATime; 143 bool PreserveATime;
144 #ifdef SUPPORT_DEVICE_FILE 144 #ifdef Z7_DEVICE_FILE
145 bool IsDeviceFile; 145 bool IsDeviceFile;
146 bool SizeDefined; 146 bool SizeDefined;
147 UInt64 Size; // it can be larger than real available size 147 UInt64 Size; // it can be larger than real available size
148 #endif 148 #endif
149 149
150 CFileBase(): _handle(INVALID_HANDLE_VALUE), PreserveATime(false) {}; 150 CFileBase(): _handle(INVALID_HANDLE_VALUE), PreserveATime(false) {}
151 ~CFileBase() { Close(); } 151 ~CFileBase() { Close(); }
152 152
153 HANDLE GetHandle() const { return _handle; } 153 HANDLE GetHandle() const { return _handle; }
154 154
155 // void Detach() { _handle = INVALID_HANDLE_VALUE; }
156
155 bool Close() throw(); 157 bool Close() throw();
156 158
157 bool GetPosition(UInt64 &position) const throw(); 159 bool GetPosition(UInt64 &position) const throw();
@@ -193,7 +195,7 @@ struct my_DISK_GEOMETRY_EX
193 195
194class CInFile: public CFileBase 196class CInFile: public CFileBase
195{ 197{
196 #ifdef SUPPORT_DEVICE_FILE 198 #ifdef Z7_DEVICE_FILE
197 199
198 #ifndef UNDER_CE 200 #ifndef UNDER_CE
199 201
@@ -232,6 +234,14 @@ public:
232 // we must use (FILE_FLAG_BACKUP_SEMANTICS) to open handle of directory. 234 // we must use (FILE_FLAG_BACKUP_SEMANTICS) to open handle of directory.
233 } 235 }
234 236
237 bool Open_for_FileRenameInformation(CFSTR fileName)
238 {
239 return Create(fileName, DELETE | SYNCHRONIZE | GENERIC_READ,
240 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
241 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL);
242 // we must use (FILE_FLAG_BACKUP_SEMANTICS) to open handle of directory.
243 }
244
235 bool OpenReparse(CFSTR fileName) 245 bool OpenReparse(CFSTR fileName)
236 { 246 {
237 // 17.02 fix: to support Windows XP compatibility junctions: 247 // 17.02 fix: to support Windows XP compatibility junctions:
@@ -295,12 +305,13 @@ protected:
295 UInt64 Size; // it can be larger than real available size 305 UInt64 Size; // it can be larger than real available size
296 */ 306 */
297 307
298 bool OpenBinary(const char *name, int flags); 308 bool OpenBinary(const char *name, int flags, mode_t mode = 0666);
299public: 309public:
300 bool PreserveATime; 310 bool PreserveATime;
301 311
302 CFileBase(): _handle(-1), PreserveATime(false) {}; 312 CFileBase(): _handle(-1), PreserveATime(false) {}
303 ~CFileBase() { Close(); } 313 ~CFileBase() { Close(); }
314 // void Detach() { _handle = -1; }
304 bool Close(); 315 bool Close();
305 bool GetLength(UInt64 &length) const; 316 bool GetLength(UInt64 &length) const;
306 off_t seek(off_t distanceToMove, int moveMethod) const; 317 off_t seek(off_t distanceToMove, int moveMethod) const;
@@ -330,7 +341,6 @@ class COutFile: public CFileBase
330 bool CTime_defined; 341 bool CTime_defined;
331 bool ATime_defined; 342 bool ATime_defined;
332 bool MTime_defined; 343 bool MTime_defined;
333
334 CFiTime CTime; 344 CFiTime CTime;
335 CFiTime ATime; 345 CFiTime ATime;
336 CFiTime MTime; 346 CFiTime MTime;
@@ -338,10 +348,13 @@ class COutFile: public CFileBase
338 AString Path; 348 AString Path;
339 ssize_t write_part(const void *data, size_t size) throw(); 349 ssize_t write_part(const void *data, size_t size) throw();
340public: 350public:
351 mode_t mode_for_Create;
352
341 COutFile(): 353 COutFile():
342 CTime_defined(false), 354 CTime_defined(false),
343 ATime_defined(false), 355 ATime_defined(false),
344 MTime_defined(false) 356 MTime_defined(false),
357 mode_for_Create(0666)
345 {} 358 {}
346 359
347 bool Close(); 360 bool Close();
diff --git a/CPP/Windows/FileLink.cpp b/CPP/Windows/FileLink.cpp
index 8ce634f..2b9fa1a 100644
--- a/CPP/Windows/FileLink.cpp
+++ b/CPP/Windows/FileLink.cpp
@@ -8,7 +8,7 @@
8#include <unistd.h> 8#include <unistd.h>
9#endif 9#endif
10 10
11#ifdef SUPPORT_DEVICE_FILE 11#ifdef Z7_DEVICE_FILE
12#include "../../C/Alloc.h" 12#include "../../C/Alloc.h"
13#endif 13#endif
14 14
@@ -20,6 +20,15 @@
20#include "FileIO.h" 20#include "FileIO.h"
21#include "FileName.h" 21#include "FileName.h"
22 22
23#ifdef Z7_OLD_WIN_SDK
24#ifndef ERROR_INVALID_REPARSE_DATA
25#define ERROR_INVALID_REPARSE_DATA 4392L
26#endif
27#ifndef ERROR_REPARSE_TAG_INVALID
28#define ERROR_REPARSE_TAG_INVALID 4393L
29#endif
30#endif
31
23#ifndef _UNICODE 32#ifndef _UNICODE
24extern bool g_IsNT; 33extern bool g_IsNT;
25#endif 34#endif
@@ -72,13 +81,13 @@ static const UInt32 kReparseFlags_Alias = (1 << 29);
72static const UInt32 kReparseFlags_HighLatency = (1 << 30); 81static const UInt32 kReparseFlags_HighLatency = (1 << 30);
73static const UInt32 kReparseFlags_Microsoft = ((UInt32)1 << 31); 82static const UInt32 kReparseFlags_Microsoft = ((UInt32)1 << 31);
74 83
75#define _my_IO_REPARSE_TAG_HSM (0xC0000004L) 84#define Z7_WIN_IO_REPARSE_TAG_HSM (0xC0000004L)
76#define _my_IO_REPARSE_TAG_HSM2 (0x80000006L) 85#define Z7_WIN_IO_REPARSE_TAG_HSM2 (0x80000006L)
77#define _my_IO_REPARSE_TAG_SIS (0x80000007L) 86#define Z7_WIN_IO_REPARSE_TAG_SIS (0x80000007L)
78#define _my_IO_REPARSE_TAG_WIM (0x80000008L) 87#define Z7_WIN_IO_REPARSE_TAG_WIM (0x80000008L)
79#define _my_IO_REPARSE_TAG_CSV (0x80000009L) 88#define Z7_WIN_IO_REPARSE_TAG_CSV (0x80000009L)
80#define _my_IO_REPARSE_TAG_DFS (0x8000000AL) 89#define Z7_WIN_IO_REPARSE_TAG_DFS (0x8000000AL)
81#define _my_IO_REPARSE_TAG_DFSR (0x80000012L) 90#define Z7_WIN_IO_REPARSE_TAG_DFSR (0x80000012L)
82*/ 91*/
83 92
84#define Get16(p) GetUi16(p) 93#define Get16(p) GetUi16(p)
@@ -112,7 +121,7 @@ static void WriteString(Byte *dest, const wchar_t *path)
112 wchar_t c = *path++; 121 wchar_t c = *path++;
113 if (c == 0) 122 if (c == 0)
114 return; 123 return;
115 Set16(dest, (UInt16)c); 124 Set16(dest, (UInt16)c)
116 dest += 2; 125 dest += 2;
117 } 126 }
118} 127}
@@ -133,10 +142,10 @@ bool FillLinkData(CByteBuffer &dest, const wchar_t *path, bool isSymLink, bool i
133 return false; 142 return false;
134 dest.Alloc(8 + size); 143 dest.Alloc(8 + size);
135 Byte *p = dest; 144 Byte *p = dest;
136 Set32(p, _my_IO_REPARSE_TAG_LX_SYMLINK); 145 Set32(p, Z7_WIN_IO_REPARSE_TAG_LX_SYMLINK)
137 Set16(p + 4, (UInt16)(size)); 146 Set16(p + 4, (UInt16)(size))
138 Set16(p + 6, 0); 147 Set16(p + 6, 0)
139 Set32(p + 8, _my_LX_SYMLINK_FLAG); 148 Set32(p + 8, Z7_WIN_LX_SYMLINK_FLAG)
140 memcpy(p + 12, utf.Ptr(), utf.Len()); 149 memcpy(p + 12, utf.Ptr(), utf.Len());
141 return true; 150 return true;
142 } 151 }
@@ -176,12 +185,12 @@ bool FillLinkData(CByteBuffer &dest, const wchar_t *path, bool isSymLink, bool i
176 dest.Alloc(size); 185 dest.Alloc(size);
177 memset(dest, 0, size); 186 memset(dest, 0, size);
178 const UInt32 tag = isSymLink ? 187 const UInt32 tag = isSymLink ?
179 _my_IO_REPARSE_TAG_SYMLINK : 188 Z7_WIN_IO_REPARSE_TAG_SYMLINK :
180 _my_IO_REPARSE_TAG_MOUNT_POINT; 189 Z7_WIN_IO_REPARSE_TAG_MOUNT_POINT;
181 Byte *p = dest; 190 Byte *p = dest;
182 Set32(p, tag); 191 Set32(p, tag)
183 Set16(p + 4, (UInt16)(size - 8)); 192 Set16(p + 4, (UInt16)(size - 8))
184 Set16(p + 6, 0); 193 Set16(p + 6, 0)
185 p += 8; 194 p += 8;
186 195
187 unsigned subOffs = 0; 196 unsigned subOffs = 0;
@@ -191,16 +200,16 @@ bool FillLinkData(CByteBuffer &dest, const wchar_t *path, bool isSymLink, bool i
191 else 200 else
192 printOffs = (unsigned)len1 + 2; 201 printOffs = (unsigned)len1 + 2;
193 202
194 Set16(p + 0, (UInt16)subOffs); 203 Set16(p + 0, (UInt16)subOffs)
195 Set16(p + 2, (UInt16)len1); 204 Set16(p + 2, (UInt16)len1)
196 Set16(p + 4, (UInt16)printOffs); 205 Set16(p + 4, (UInt16)printOffs)
197 Set16(p + 6, (UInt16)len2); 206 Set16(p + 6, (UInt16)len2)
198 207
199 p += 8; 208 p += 8;
200 if (isSymLink) 209 if (isSymLink)
201 { 210 {
202 UInt32 flags = isAbs ? 0 : _my_SYMLINK_FLAG_RELATIVE; 211 UInt32 flags = isAbs ? 0 : Z7_WIN_SYMLINK_FLAG_RELATIVE;
203 Set32(p, flags); 212 Set32(p, flags)
204 p += 4; 213 p += 4;
205 } 214 }
206 215
@@ -255,9 +264,9 @@ bool CReparseAttr::Parse(const Byte *p, size_t size)
255 264
256 HeaderError = false; 265 HeaderError = false;
257 266
258 if ( Tag != _my_IO_REPARSE_TAG_MOUNT_POINT 267 if ( Tag != Z7_WIN_IO_REPARSE_TAG_MOUNT_POINT
259 && Tag != _my_IO_REPARSE_TAG_SYMLINK 268 && Tag != Z7_WIN_IO_REPARSE_TAG_SYMLINK
260 && Tag != _my_IO_REPARSE_TAG_LX_SYMLINK) 269 && Tag != Z7_WIN_IO_REPARSE_TAG_LX_SYMLINK)
261 { 270 {
262 // for unsupported reparse points 271 // for unsupported reparse points
263 ErrorCode = (DWORD)ERROR_REPARSE_TAG_INVALID; // ERROR_REPARSE_TAG_MISMATCH 272 ErrorCode = (DWORD)ERROR_REPARSE_TAG_INVALID; // ERROR_REPARSE_TAG_MISMATCH
@@ -270,12 +279,12 @@ bool CReparseAttr::Parse(const Byte *p, size_t size)
270 p += 8; 279 p += 8;
271 size -= 8; 280 size -= 8;
272 281
273 if (Tag == _my_IO_REPARSE_TAG_LX_SYMLINK) 282 if (Tag == Z7_WIN_IO_REPARSE_TAG_LX_SYMLINK)
274 { 283 {
275 if (len < 4) 284 if (len < 4)
276 return false; 285 return false;
277 Flags = Get32(p); // maybe it's not Flags 286 Flags = Get32(p); // maybe it's not Flags
278 if (Flags != _my_LX_SYMLINK_FLAG) 287 if (Flags != Z7_WIN_LX_SYMLINK_FLAG)
279 return false; 288 return false;
280 len -= 4; 289 len -= 4;
281 p += 4; 290 p += 4;
@@ -304,7 +313,7 @@ bool CReparseAttr::Parse(const Byte *p, size_t size)
304 p += 8; 313 p += 8;
305 314
306 Flags = 0; 315 Flags = 0;
307 if (Tag == _my_IO_REPARSE_TAG_SYMLINK) 316 if (Tag == Z7_WIN_IO_REPARSE_TAG_SYMLINK)
308 { 317 {
309 if (len < 4) 318 if (len < 4)
310 return false; 319 return false;
@@ -341,8 +350,8 @@ bool CReparseShortInfo::Parse(const Byte *p, size_t size)
341 (type & kReparseFlags_Microsoft) == 0 || 350 (type & kReparseFlags_Microsoft) == 0 ||
342 (type & 0xFFFF) != 3) 351 (type & 0xFFFF) != 3)
343 */ 352 */
344 if (Tag != _my_IO_REPARSE_TAG_MOUNT_POINT && 353 if (Tag != Z7_WIN_IO_REPARSE_TAG_MOUNT_POINT &&
345 Tag != _my_IO_REPARSE_TAG_SYMLINK) 354 Tag != Z7_WIN_IO_REPARSE_TAG_SYMLINK)
346 // return true; 355 // return true;
347 return false; 356 return false;
348 357
@@ -365,7 +374,7 @@ bool CReparseShortInfo::Parse(const Byte *p, size_t size)
365 p += 8; 374 p += 8;
366 375
367 // UInt32 Flags = 0; 376 // UInt32 Flags = 0;
368 if (Tag == _my_IO_REPARSE_TAG_SYMLINK) 377 if (Tag == Z7_WIN_IO_REPARSE_TAG_SYMLINK)
369 { 378 {
370 if (len < 4) 379 if (len < 4)
371 return false; 380 return false;
@@ -426,13 +435,13 @@ UString CReparseAttr::GetPath() const
426 return s; 435 return s;
427} 436}
428 437
429#ifdef SUPPORT_DEVICE_FILE 438#ifdef Z7_DEVICE_FILE
430 439
431namespace NSystem 440namespace NSystem
432{ 441{
433bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize); 442bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize, UInt64 &freeSize);
434} 443}
435#endif // SUPPORT_DEVICE_FILE 444#endif // Z7_DEVICE_FILE
436 445
437#if defined(_WIN32) && !defined(UNDER_CE) 446#if defined(_WIN32) && !defined(UNDER_CE)
438 447
diff --git a/CPP/Windows/FileMapping.h b/CPP/Windows/FileMapping.h
index f90c429..caa7ea3 100644
--- a/CPP/Windows/FileMapping.h
+++ b/CPP/Windows/FileMapping.h
@@ -1,7 +1,7 @@
1// Windows/FileMapping.h 1// Windows/FileMapping.h
2 2
3#ifndef __WINDOWS_FILEMAPPING_H 3#ifndef ZIP7_INC_WINDOWS_FILE_MAPPING_H
4#define __WINDOWS_FILEMAPPING_H 4#define ZIP7_INC_WINDOWS_FILE_MAPPING_H
5 5
6#include "../Common/MyTypes.h" 6#include "../Common/MyTypes.h"
7 7
@@ -34,7 +34,7 @@ public:
34 return res; 34 return res;
35 #else 35 #else
36 _handle = ::OpenFileMapping(desiredAccess, FALSE, name); 36 _handle = ::OpenFileMapping(desiredAccess, FALSE, name);
37 if (_handle != 0) 37 if (_handle != NULL)
38 return 0; 38 return 0;
39 return ::GetLastError(); 39 return ::GetLastError();
40 #endif 40 #endif
diff --git a/CPP/Windows/FileName.cpp b/CPP/Windows/FileName.cpp
index d61ff7e..c9c4f8b 100644
--- a/CPP/Windows/FileName.cpp
+++ b/CPP/Windows/FileName.cpp
@@ -6,9 +6,9 @@
6#include <limits.h> 6#include <limits.h>
7#include <unistd.h> 7#include <unistd.h>
8#include "../Common/StringConvert.h" 8#include "../Common/StringConvert.h"
9#include "FileDir.h"
10#endif 9#endif
11 10
11#include "FileDir.h"
12#include "FileName.h" 12#include "FileName.h"
13 13
14#ifndef _UNICODE 14#ifndef _UNICODE
@@ -68,7 +68,7 @@ void NormalizeDirPathPrefix(UString &dirPath)
68#ifdef _WIN32 68#ifdef _WIN32
69 69
70#ifndef USE_UNICODE_FSTRING 70#ifndef USE_UNICODE_FSTRING
71#ifdef WIN_LONG_PATH 71#ifdef Z7_LONG_PATH
72static void NormalizeDirSeparators(UString &s) 72static void NormalizeDirSeparators(UString &s)
73{ 73{
74 const unsigned len = s.Len(); 74 const unsigned len = s.Len();
@@ -90,7 +90,7 @@ void NormalizeDirSeparators(FString &s)
90#endif 90#endif
91 91
92 92
93#define IS_LETTER_CHAR(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && (c) <= 'Z')) 93#define IS_LETTER_CHAR(c) ((((unsigned)(int)(c) | 0x20) - (unsigned)'a' <= (unsigned)('z' - 'a')))
94 94
95bool IsDrivePath(const wchar_t *s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':' && IS_SEPAR(s[2]); } 95bool IsDrivePath(const wchar_t *s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':' && IS_SEPAR(s[2]); }
96 96
@@ -120,7 +120,7 @@ bool IsAltPathPrefix(CFSTR s) throw()
120#if defined(_WIN32) && !defined(UNDER_CE) 120#if defined(_WIN32) && !defined(UNDER_CE)
121 121
122const char * const kSuperPathPrefix = "\\\\?\\"; 122const char * const kSuperPathPrefix = "\\\\?\\";
123#ifdef WIN_LONG_PATH 123#ifdef Z7_LONG_PATH
124static const char * const kSuperUncPrefix = "\\\\?\\UNC\\"; 124static const char * const kSuperUncPrefix = "\\\\?\\UNC\\";
125#endif 125#endif
126 126
@@ -191,7 +191,7 @@ unsigned GetNetworkServerPrefixSize(CFSTR s) throw()
191 if (c == '.' || c == '?') 191 if (c == '.' || c == '?')
192 return 0; 192 return 0;
193 } 193 }
194 int pos = FindSepar(s + prefixSize); 194 const int pos = FindSepar(s + prefixSize);
195 if (pos < 0) 195 if (pos < 0)
196 return 0; 196 return 0;
197 return prefixSize + (unsigned)(pos + 1); 197 return prefixSize + (unsigned)(pos + 1);
@@ -199,11 +199,11 @@ unsigned GetNetworkServerPrefixSize(CFSTR s) throw()
199 199
200bool IsNetworkShareRootPath(CFSTR s) throw() 200bool IsNetworkShareRootPath(CFSTR s) throw()
201{ 201{
202 unsigned prefixSize = GetNetworkServerPrefixSize(s); 202 const unsigned prefixSize = GetNetworkServerPrefixSize(s);
203 if (prefixSize == 0) 203 if (prefixSize == 0)
204 return false; 204 return false;
205 s += prefixSize; 205 s += prefixSize;
206 int pos = FindSepar(s); 206 const int pos = FindSepar(s);
207 if (pos < 0) 207 if (pos < 0)
208 return true; 208 return true;
209 return s[(unsigned)pos + 1] == 0; 209 return s[(unsigned)pos + 1] == 0;
@@ -217,6 +217,37 @@ bool IsSuperPath(const wchar_t *s) throw() { return IS_SUPER_PREFIX(s); }
217bool IsSuperOrDevicePath(const wchar_t *s) throw() { return IS_SUPER_OR_DEVICE_PATH(s); } 217bool IsSuperOrDevicePath(const wchar_t *s) throw() { return IS_SUPER_OR_DEVICE_PATH(s); }
218// bool IsSuperUncPath(const wchar_t *s) throw() { return (IS_SUPER_PREFIX(s) && IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize)); } 218// bool IsSuperUncPath(const wchar_t *s) throw() { return (IS_SUPER_PREFIX(s) && IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize)); }
219 219
220bool IsAltStreamPrefixWithColon(const UString &s) throw()
221{
222 if (s.IsEmpty())
223 return false;
224 if (s.Back() != ':')
225 return false;
226 unsigned pos = 0;
227 if (IsSuperPath(s))
228 pos = kSuperPathPrefixSize;
229 if (s.Len() - pos == 2 && IsDrivePath2(s.Ptr(pos)))
230 return false;
231 return true;
232}
233
234bool If_IsSuperPath_RemoveSuperPrefix(UString &s)
235{
236 if (!IsSuperPath(s))
237 return false;
238 unsigned start = 0;
239 unsigned count = kSuperPathPrefixSize;
240 const wchar_t *s2 = s.Ptr(kSuperPathPrefixSize);
241 if (IS_UNC_WITH_SLASH(s2))
242 {
243 start = 2;
244 count = kSuperUncPathPrefixSize - 2;
245 }
246 s.Delete(start, count);
247 return true;
248}
249
250
220#ifndef USE_UNICODE_FSTRING 251#ifndef USE_UNICODE_FSTRING
221bool IsDrivePath2(CFSTR s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':'; } 252bool IsDrivePath2(CFSTR s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':'; }
222// bool IsDriveName2(CFSTR s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':' && s[2] == 0; } 253// bool IsDriveName2(CFSTR s) throw() { return IS_LETTER_CHAR(s[0]) && s[1] == ':' && s[2] == 0; }
@@ -288,7 +319,7 @@ static unsigned GetRootPrefixSize_Of_SimplePath(CFSTR s)
288 return 0; 319 return 0;
289 if (s[1] == 0 || !IS_SEPAR(s[1])) 320 if (s[1] == 0 || !IS_SEPAR(s[1]))
290 return 1; 321 return 1;
291 unsigned size = GetRootPrefixSize_Of_NetworkPath(s + 2); 322 const unsigned size = GetRootPrefixSize_Of_NetworkPath(s + 2);
292 return (size == 0) ? 0 : 2 + size; 323 return (size == 0) ? 0 : 2 + size;
293} 324}
294 325
@@ -296,11 +327,11 @@ static unsigned GetRootPrefixSize_Of_SuperPath(CFSTR s)
296{ 327{
297 if (IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize)) 328 if (IS_UNC_WITH_SLASH(s + kSuperPathPrefixSize))
298 { 329 {
299 unsigned size = GetRootPrefixSize_Of_NetworkPath(s + kSuperUncPathPrefixSize); 330 const unsigned size = GetRootPrefixSize_Of_NetworkPath(s + kSuperUncPathPrefixSize);
300 return (size == 0) ? 0 : kSuperUncPathPrefixSize + size; 331 return (size == 0) ? 0 : kSuperUncPathPrefixSize + size;
301 } 332 }
302 // we support \\?\c:\ paths and volume GUID paths \\?\Volume{GUID}\" 333 // we support \\?\c:\ paths and volume GUID paths \\?\Volume{GUID}\"
303 int pos = FindSepar(s + kSuperPathPrefixSize); 334 const int pos = FindSepar(s + kSuperPathPrefixSize);
304 if (pos < 0) 335 if (pos < 0)
305 return 0; 336 return 0;
306 return kSuperPathPrefixSize + pos + 1; 337 return kSuperPathPrefixSize + pos + 1;
@@ -379,42 +410,26 @@ unsigned GetRootPrefixSize(const wchar_t *s) throw() { return IS_SEPAR(s[0]) ? 1
379 410
380#ifndef UNDER_CE 411#ifndef UNDER_CE
381 412
382static bool GetCurDir(UString &path)
383{
384 path.Empty();
385 413
386 #ifdef _WIN32 414#ifdef USE_UNICODE_FSTRING
387 415
388 DWORD needLength; 416#define GetCurDir NDir::GetCurrentDir
389 #ifndef _UNICODE
390 if (!g_IsNT)
391 {
392 TCHAR s[MAX_PATH + 2];
393 s[0] = 0;
394 needLength = ::GetCurrentDirectory(MAX_PATH + 1, s);
395 path = fs2us(fas2fs(s));
396 }
397 else
398 #endif
399 {
400 WCHAR s[MAX_PATH + 2];
401 s[0] = 0;
402 needLength = ::GetCurrentDirectoryW(MAX_PATH + 1, s);
403 path = s;
404 }
405 return (needLength > 0 && needLength <= MAX_PATH);
406 417
407 #else 418#else
408 419
420static bool GetCurDir(UString &path)
421{
422 path.Empty();
409 FString s; 423 FString s;
410 if (!NDir::GetCurrentDir(s)) 424 if (!NDir::GetCurrentDir(s))
411 return false; 425 return false;
412 path = GetUnicodeString(s); 426 path = fs2us(s);
413 return true; 427 return true;
414
415 #endif
416} 428}
417 429
430#endif
431
432
418static bool ResolveDotsFolders(UString &s) 433static bool ResolveDotsFolders(UString &s)
419{ 434{
420 #ifdef _WIN32 435 #ifdef _WIN32
@@ -516,7 +531,7 @@ static bool AreThereDotsFolders(CFSTR s)
516#endif 531#endif
517#endif // LONG_PATH_DOTS_FOLDERS_PARSING 532#endif // LONG_PATH_DOTS_FOLDERS_PARSING
518 533
519#ifdef WIN_LONG_PATH 534#ifdef Z7_LONG_PATH
520 535
521/* 536/*
522Most of Windows versions have problems, if some file or dir name 537Most of Windows versions have problems, if some file or dir name
@@ -610,11 +625,11 @@ static bool GetSuperPathBase(CFSTR s, UString &res)
610 return true; 625 return true;
611 626
612 UString temp = fs2us(s); 627 UString temp = fs2us(s);
613 unsigned fixedSize = GetRootPrefixSize_Of_SuperPath(temp); 628 const unsigned fixedSize = GetRootPrefixSize_Of_SuperPath(temp);
614 if (fixedSize == 0) 629 if (fixedSize == 0)
615 return true; 630 return true;
616 631
617 UString rem = &temp[fixedSize]; 632 UString rem = temp.Ptr(fixedSize);
618 if (!ResolveDotsFolders(rem)) 633 if (!ResolveDotsFolders(rem))
619 return true; 634 return true;
620 635
@@ -632,13 +647,13 @@ static bool GetSuperPathBase(CFSTR s, UString &res)
632 if (IS_SEPAR(s[1])) 647 if (IS_SEPAR(s[1]))
633 { 648 {
634 UString temp = fs2us(s + 2); 649 UString temp = fs2us(s + 2);
635 unsigned fixedSize = GetRootPrefixSize_Of_NetworkPath(temp); 650 const unsigned fixedSize = GetRootPrefixSize_Of_NetworkPath(temp);
636 // we ignore that error to allow short network paths server\share? 651 // we ignore that error to allow short network paths server\share?
637 /* 652 /*
638 if (fixedSize == 0) 653 if (fixedSize == 0)
639 return false; 654 return false;
640 */ 655 */
641 UString rem = &temp[fixedSize]; 656 UString rem = temp.Ptr(fixedSize);
642 if (!ResolveDotsFolders(rem)) 657 if (!ResolveDotsFolders(rem))
643 return false; 658 return false;
644 res += kSuperUncPrefix; 659 res += kSuperUncPrefix;
@@ -783,7 +798,7 @@ bool GetSuperPath(CFSTR path, UString &superPath)
783 return false; 798 return false;
784} 799}
785*/ 800*/
786#endif // WIN_LONG_PATH 801#endif // Z7_LONG_PATH
787 802
788bool GetFullPath(CFSTR dirPrefix, CFSTR s, FString &res) 803bool GetFullPath(CFSTR dirPrefix, CFSTR s, FString &res)
789{ 804{
@@ -801,8 +816,11 @@ bool GetFullPath(CFSTR dirPrefix, CFSTR s, FString &res)
801 816
802 #else 817 #else
803 818
804 unsigned prefixSize = GetRootPrefixSize(s); 819 const unsigned prefixSize = GetRootPrefixSize(s);
805 if (prefixSize != 0) 820 if (prefixSize != 0)
821#ifdef _WIN32
822 if (prefixSize != 1)
823#endif
806 { 824 {
807 if (!AreThereDotsFolders(s + prefixSize)) 825 if (!AreThereDotsFolders(s + prefixSize))
808 return true; 826 return true;
@@ -815,21 +833,9 @@ bool GetFullPath(CFSTR dirPrefix, CFSTR s, FString &res)
815 return true; 833 return true;
816 } 834 }
817 835
818 /*
819 FChar c = s[0];
820 if (c == 0)
821 return true;
822 if (c == '.' && (s[1] == 0 || (s[1] == '.' && s[2] == 0)))
823 return true;
824 if (IS_SEPAR(c) && IS_SEPAR(s[1]))
825 return true;
826 if (IsDrivePath(s))
827 return true;
828 */
829
830 UString curDir; 836 UString curDir;
831 if (dirPrefix) 837 if (dirPrefix && prefixSize == 0)
832 curDir = fs2us(dirPrefix); 838 curDir = fs2us(dirPrefix); // we use (dirPrefix), only if (s) path is relative
833 else 839 else
834 { 840 {
835 if (!GetCurDir(curDir)) 841 if (!GetCurDir(curDir))
@@ -837,46 +843,40 @@ bool GetFullPath(CFSTR dirPrefix, CFSTR s, FString &res)
837 } 843 }
838 NormalizeDirPathPrefix(curDir); 844 NormalizeDirPathPrefix(curDir);
839 845
840 unsigned fixedSize = 0; 846 unsigned fixedSize = GetRootPrefixSize(curDir);
841 847
842 #ifdef _WIN32 848 UString temp;
843 849#ifdef _WIN32
844 if (IsSuperPath(curDir)) 850 if (prefixSize != 0)
845 { 851 {
846 fixedSize = GetRootPrefixSize_Of_SuperPath(curDir); 852 /* (s) is absolute path, but only (prefixSize == 1) is possible here.
853 So for full resolving we need root of current folder and
854 relative part of (s). */
855 s += prefixSize;
856 // (s) is relative part now
847 if (fixedSize == 0) 857 if (fixedSize == 0)
848 return false;
849 }
850 else
851 {
852 if (IsDrivePath(curDir))
853 fixedSize = kDrivePrefixSize;
854 else
855 { 858 {
856 if (!IsPathSepar(curDir[0]) || !IsPathSepar(curDir[1])) 859 // (curDir) is not absolute.
857 return false; 860 // That case is unexpected, but we support it too.
858 fixedSize = GetRootPrefixSize_Of_NetworkPath(curDir.Ptr(2)); 861 curDir.Empty();
859 if (fixedSize == 0) 862 curDir.Add_PathSepar();
860 return false; 863 fixedSize = 1;
861 fixedSize += 2; 864 // (curDir) now is just Separ character.
865 // So final (res) path later also will have Separ prefix.
862 } 866 }
863 } 867 }
864
865 #endif // _WIN32
866
867 UString temp;
868 if (IS_SEPAR(s[0]))
869 {
870 temp = fs2us(s + 1);
871 }
872 else 868 else
869#endif // _WIN32
873 { 870 {
874 temp += curDir.Ptr(fixedSize); 871 // (s) is relative path
875 temp += fs2us(s); 872 temp = curDir.Ptr(fixedSize);
873 // (temp) is relative_part_of(curDir)
876 } 874 }
875 temp += fs2us(s);
877 if (!ResolveDotsFolders(temp)) 876 if (!ResolveDotsFolders(temp))
878 return false; 877 return false;
879 curDir.DeleteFrom(fixedSize); 878 curDir.DeleteFrom(fixedSize);
879 // (curDir) now contains only absolute prefix part
880 res = us2fs(curDir); 880 res = us2fs(curDir);
881 res += us2fs(temp); 881 res += us2fs(temp);
882 882
@@ -885,6 +885,7 @@ bool GetFullPath(CFSTR dirPrefix, CFSTR s, FString &res)
885 return true; 885 return true;
886} 886}
887 887
888
888bool GetFullPath(CFSTR path, FString &fullPath) 889bool GetFullPath(CFSTR path, FString &fullPath)
889{ 890{
890 return GetFullPath(NULL, path, fullPath); 891 return GetFullPath(NULL, path, fullPath);
diff --git a/CPP/Windows/FileName.h b/CPP/Windows/FileName.h
index de8bd13..219b656 100644
--- a/CPP/Windows/FileName.h
+++ b/CPP/Windows/FileName.h
@@ -1,7 +1,7 @@
1// Windows/FileName.h 1// Windows/FileName.h
2 2
3#ifndef __WINDOWS_FILE_NAME_H 3#ifndef ZIP7_INC_WINDOWS_FILE_NAME_H
4#define __WINDOWS_FILE_NAME_H 4#define ZIP7_INC_WINDOWS_FILE_NAME_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7 7
@@ -54,6 +54,10 @@ bool IsDrivePath2(const wchar_t *s) throw(); // first 2 chars are drive chars li
54bool IsSuperPath(const wchar_t *s) throw(); 54bool IsSuperPath(const wchar_t *s) throw();
55bool IsSuperOrDevicePath(const wchar_t *s) throw(); 55bool IsSuperOrDevicePath(const wchar_t *s) throw();
56 56
57bool IsAltStreamPrefixWithColon(const UString &s) throw();
58// returns true, if super prefix was removed
59bool If_IsSuperPath_RemoveSuperPrefix(UString &s);
60
57#ifndef USE_UNICODE_FSTRING 61#ifndef USE_UNICODE_FSTRING
58bool IsDrivePath2(CFSTR s) throw(); // first 2 chars are drive chars like "a:" 62bool IsDrivePath2(CFSTR s) throw(); // first 2 chars are drive chars like "a:"
59// bool IsDriveName2(CFSTR s) throw(); // is drive name like "a:" 63// bool IsDriveName2(CFSTR s) throw(); // is drive name like "a:"
@@ -82,7 +86,7 @@ int FindAltStreamColon(CFSTR path) throw();
82bool IsAbsolutePath(const wchar_t *s) throw(); 86bool IsAbsolutePath(const wchar_t *s) throw();
83unsigned GetRootPrefixSize(const wchar_t *s) throw(); 87unsigned GetRootPrefixSize(const wchar_t *s) throw();
84 88
85#ifdef WIN_LONG_PATH 89#ifdef Z7_LONG_PATH
86 90
87const int kSuperPathType_UseOnlyMain = 0; 91const int kSuperPathType_UseOnlyMain = 0;
88const int kSuperPathType_UseOnlySuper = 1; 92const int kSuperPathType_UseOnlySuper = 1;
@@ -92,16 +96,16 @@ int GetUseSuperPathType(CFSTR s) throw();
92bool GetSuperPath(CFSTR path, UString &superPath, bool onlyIfNew); 96bool GetSuperPath(CFSTR path, UString &superPath, bool onlyIfNew);
93bool GetSuperPaths(CFSTR s1, CFSTR s2, UString &d1, UString &d2, bool onlyIfNew); 97bool GetSuperPaths(CFSTR s1, CFSTR s2, UString &d1, UString &d2, bool onlyIfNew);
94 98
95#define USE_MAIN_PATH (__useSuperPathType != kSuperPathType_UseOnlySuper) 99#define USE_MAIN_PATH (_useSuperPathType != kSuperPathType_UseOnlySuper)
96#define USE_MAIN_PATH_2 (__useSuperPathType1 != kSuperPathType_UseOnlySuper && __useSuperPathType2 != kSuperPathType_UseOnlySuper) 100#define USE_MAIN_PATH_2 (_useSuperPathType1 != kSuperPathType_UseOnlySuper && _useSuperPathType2 != kSuperPathType_UseOnlySuper)
97 101
98#define USE_SUPER_PATH (__useSuperPathType != kSuperPathType_UseOnlyMain) 102#define USE_SUPER_PATH (_useSuperPathType != kSuperPathType_UseOnlyMain)
99#define USE_SUPER_PATH_2 (__useSuperPathType1 != kSuperPathType_UseOnlyMain || __useSuperPathType2 != kSuperPathType_UseOnlyMain) 103#define USE_SUPER_PATH_2 (_useSuperPathType1 != kSuperPathType_UseOnlyMain || _useSuperPathType2 != kSuperPathType_UseOnlyMain)
100 104
101#define IF_USE_MAIN_PATH int __useSuperPathType = GetUseSuperPathType(path); if (USE_MAIN_PATH) 105#define IF_USE_MAIN_PATH int _useSuperPathType = GetUseSuperPathType(path); if (USE_MAIN_PATH)
102#define IF_USE_MAIN_PATH_2(x1, x2) \ 106#define IF_USE_MAIN_PATH_2(x1, x2) \
103 int __useSuperPathType1 = GetUseSuperPathType(x1); \ 107 int _useSuperPathType1 = GetUseSuperPathType(x1); \
104 int __useSuperPathType2 = GetUseSuperPathType(x2); \ 108 int _useSuperPathType2 = GetUseSuperPathType(x2); \
105 if (USE_MAIN_PATH_2) 109 if (USE_MAIN_PATH_2)
106 110
107#else 111#else
@@ -109,8 +113,18 @@ bool GetSuperPaths(CFSTR s1, CFSTR s2, UString &d1, UString &d2, bool onlyIfNew)
109#define IF_USE_MAIN_PATH 113#define IF_USE_MAIN_PATH
110#define IF_USE_MAIN_PATH_2(x1, x2) 114#define IF_USE_MAIN_PATH_2(x1, x2)
111 115
112#endif // WIN_LONG_PATH 116#endif // Z7_LONG_PATH
113 117
118/*
119 if (dirPrefix != NULL && (path) is relative)
120 {
121 (dirPrefix) will be used
122 result (fullPath) will contain prefix part of (dirPrefix).
123 }
124 Current_Dir path can be used in 2 cases:
125 1) if (path) is relative && dirPrefix == NULL
126 2) for _WIN32: if (path) is absolute starting wuth "\"
127*/
114bool GetFullPath(CFSTR dirPrefix, CFSTR path, FString &fullPath); 128bool GetFullPath(CFSTR dirPrefix, CFSTR path, FString &fullPath);
115bool GetFullPath(CFSTR path, FString &fullPath); 129bool GetFullPath(CFSTR path, FString &fullPath);
116 130
diff --git a/CPP/Windows/FileSystem.cpp b/CPP/Windows/FileSystem.cpp
index 6259453..6a262d9 100644
--- a/CPP/Windows/FileSystem.cpp
+++ b/CPP/Windows/FileSystem.cpp
@@ -71,14 +71,14 @@ UINT MyGetDriveType(CFSTR pathName)
71 } 71 }
72} 72}
73 73
74typedef BOOL (WINAPI * GetDiskFreeSpaceExA_Pointer)( 74typedef BOOL (WINAPI * Func_GetDiskFreeSpaceExA)(
75 LPCSTR lpDirectoryName, // directory name 75 LPCSTR lpDirectoryName, // directory name
76 PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller 76 PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller
77 PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk 77 PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk
78 PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk 78 PULARGE_INTEGER lpTotalNumberOfFreeBytes // free bytes on disk
79); 79);
80 80
81typedef BOOL (WINAPI * GetDiskFreeSpaceExW_Pointer)( 81typedef BOOL (WINAPI * Func_GetDiskFreeSpaceExW)(
82 LPCWSTR lpDirectoryName, // directory name 82 LPCWSTR lpDirectoryName, // directory name
83 PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller 83 PULARGE_INTEGER lpFreeBytesAvailable, // bytes available to caller
84 PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk 84 PULARGE_INTEGER lpTotalNumberOfBytes, // bytes on disk
@@ -92,12 +92,14 @@ bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize,
92 #ifndef _UNICODE 92 #ifndef _UNICODE
93 if (!g_IsNT) 93 if (!g_IsNT)
94 { 94 {
95 GetDiskFreeSpaceExA_Pointer pGetDiskFreeSpaceEx = (GetDiskFreeSpaceExA_Pointer)(void *)GetProcAddress( 95 const
96 GetModuleHandle(TEXT("kernel32.dll")), "GetDiskFreeSpaceExA"); 96 Func_GetDiskFreeSpaceExA f = Z7_GET_PROC_ADDRESS(
97 if (pGetDiskFreeSpaceEx) 97 Func_GetDiskFreeSpaceExA, GetModuleHandle(TEXT("kernel32.dll")),
98 "GetDiskFreeSpaceExA");
99 if (f)
98 { 100 {
99 ULARGE_INTEGER freeBytesToCaller2, totalSize2, freeSize2; 101 ULARGE_INTEGER freeBytesToCaller2, totalSize2, freeSize2;
100 sizeIsDetected = BOOLToBool(pGetDiskFreeSpaceEx(fs2fas(rootPath), &freeBytesToCaller2, &totalSize2, &freeSize2)); 102 sizeIsDetected = BOOLToBool(f(fs2fas(rootPath), &freeBytesToCaller2, &totalSize2, &freeSize2));
101 totalSize = totalSize2.QuadPart; 103 totalSize = totalSize2.QuadPart;
102 freeSize = freeSize2.QuadPart; 104 freeSize = freeSize2.QuadPart;
103 } 105 }
@@ -107,12 +109,14 @@ bool MyGetDiskFreeSpace(CFSTR rootPath, UInt64 &clusterSize, UInt64 &totalSize,
107 else 109 else
108 #endif 110 #endif
109 { 111 {
110 GetDiskFreeSpaceExW_Pointer pGetDiskFreeSpaceEx = (GetDiskFreeSpaceExW_Pointer)(void *)GetProcAddress( 112 const
111 GetModuleHandle(TEXT("kernel32.dll")), "GetDiskFreeSpaceExW"); 113 Func_GetDiskFreeSpaceExW f = Z7_GET_PROC_ADDRESS(
112 if (pGetDiskFreeSpaceEx) 114 Func_GetDiskFreeSpaceExW, GetModuleHandle(TEXT("kernel32.dll")),
115 "GetDiskFreeSpaceExW");
116 if (f)
113 { 117 {
114 ULARGE_INTEGER freeBytesToCaller2, totalSize2, freeSize2; 118 ULARGE_INTEGER freeBytesToCaller2, totalSize2, freeSize2;
115 sizeIsDetected = BOOLToBool(pGetDiskFreeSpaceEx(fs2us(rootPath), &freeBytesToCaller2, &totalSize2, &freeSize2)); 119 sizeIsDetected = BOOLToBool(f(fs2us(rootPath), &freeBytesToCaller2, &totalSize2, &freeSize2));
116 totalSize = totalSize2.QuadPart; 120 totalSize = totalSize2.QuadPart;
117 freeSize = freeSize2.QuadPart; 121 freeSize = freeSize2.QuadPart;
118 } 122 }
diff --git a/CPP/Windows/FileSystem.h b/CPP/Windows/FileSystem.h
index 9b49a02..9f9e399 100644
--- a/CPP/Windows/FileSystem.h
+++ b/CPP/Windows/FileSystem.h
@@ -1,7 +1,7 @@
1// Windows/FileSystem.h 1// Windows/FileSystem.h
2 2
3#ifndef __WINDOWS_FILE_SYSTEM_H 3#ifndef ZIP7_INC_WINDOWS_FILE_SYSTEM_H
4#define __WINDOWS_FILE_SYSTEM_H 4#define ZIP7_INC_WINDOWS_FILE_SYSTEM_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7#include "../Common/MyTypes.h" 7#include "../Common/MyTypes.h"
diff --git a/CPP/Windows/Handle.h b/CPP/Windows/Handle.h
index 5878c83..6ae09ec 100644
--- a/CPP/Windows/Handle.h
+++ b/CPP/Windows/Handle.h
@@ -1,9 +1,9 @@
1// Windows/Handle.h 1// Windows/Handle.h
2 2
3#ifndef __WINDOWS_HANDLE_H 3#ifndef ZIP7_INC_WINDOWS_HANDLE_H
4#define __WINDOWS_HANDLE_H 4#define ZIP7_INC_WINDOWS_HANDLE_H
5 5
6#include "../Common/MyTypes.h" 6#include "../Common/MyWindows.h"
7 7
8namespace NWindows { 8namespace NWindows {
9 9
@@ -28,7 +28,7 @@ public:
28 void Attach(HANDLE handle) { _handle = handle; } 28 void Attach(HANDLE handle) { _handle = handle; }
29 HANDLE Detach() 29 HANDLE Detach()
30 { 30 {
31 HANDLE handle = _handle; 31 const HANDLE handle = _handle;
32 _handle = NULL; 32 _handle = NULL;
33 return handle; 33 return handle;
34 } 34 }
diff --git a/CPP/Windows/MemoryGlobal.h b/CPP/Windows/MemoryGlobal.h
index c217510..6852591 100644
--- a/CPP/Windows/MemoryGlobal.h
+++ b/CPP/Windows/MemoryGlobal.h
@@ -1,7 +1,7 @@
1// Windows/MemoryGlobal.h 1// Windows/MemoryGlobal.h
2 2
3#ifndef __WINDOWS_MEMORY_GLOBAL_H 3#ifndef ZIP7_INC_WINDOWS_MEMORY_GLOBAL_H
4#define __WINDOWS_MEMORY_GLOBAL_H 4#define ZIP7_INC_WINDOWS_MEMORY_GLOBAL_H
5 5
6#include "../Common/MyWindows.h" 6#include "../Common/MyWindows.h"
7 7
@@ -12,7 +12,7 @@ class CGlobal
12{ 12{
13 HGLOBAL _global; 13 HGLOBAL _global;
14public: 14public:
15 CGlobal(): _global(NULL){}; 15 CGlobal(): _global(NULL) {}
16 ~CGlobal() { Free(); } 16 ~CGlobal() { Free(); }
17 operator HGLOBAL() const { return _global; } 17 operator HGLOBAL() const { return _global; }
18 void Attach(HGLOBAL hGlobal) 18 void Attach(HGLOBAL hGlobal)
@@ -22,7 +22,7 @@ public:
22 } 22 }
23 HGLOBAL Detach() 23 HGLOBAL Detach()
24 { 24 {
25 HGLOBAL h = _global; 25 const HGLOBAL h = _global;
26 _global = NULL; 26 _global = NULL;
27 return h; 27 return h;
28 } 28 }
@@ -42,10 +42,10 @@ public:
42 CGlobalLock(HGLOBAL hGlobal): _global(hGlobal) 42 CGlobalLock(HGLOBAL hGlobal): _global(hGlobal)
43 { 43 {
44 _ptr = GlobalLock(hGlobal); 44 _ptr = GlobalLock(hGlobal);
45 }; 45 }
46 ~CGlobalLock() 46 ~CGlobalLock()
47 { 47 {
48 if (_ptr != NULL) 48 if (_ptr)
49 GlobalUnlock(_global); 49 GlobalUnlock(_global);
50 } 50 }
51}; 51};
diff --git a/CPP/Windows/MemoryLock.cpp b/CPP/Windows/MemoryLock.cpp
index 24866b1..0bd7504 100644
--- a/CPP/Windows/MemoryLock.cpp
+++ b/CPP/Windows/MemoryLock.cpp
@@ -21,7 +21,10 @@ typedef BOOL (WINAPI * Func_LookupPrivilegeValue)(LPCTSTR lpSystemName, LPCTSTR
21typedef BOOL (WINAPI * Func_AdjustTokenPrivileges)(HANDLE TokenHandle, BOOL DisableAllPrivileges, 21typedef BOOL (WINAPI * Func_AdjustTokenPrivileges)(HANDLE TokenHandle, BOOL DisableAllPrivileges,
22 PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength); 22 PTOKEN_PRIVILEGES NewState, DWORD BufferLength, PTOKEN_PRIVILEGES PreviousState, PDWORD ReturnLength);
23} 23}
24#define GET_PROC_ADDR(fff, name) Func_ ## fff my_ ## fff = (Func_ ## fff) (void(*)()) GetProcAddress(hModule, name) 24
25#define GET_PROC_ADDR(fff, name) \
26 const Func_ ## fff my_ ## fff = Z7_GET_PROC_ADDRESS( \
27 Func_ ## fff, hModule, name);
25#endif 28#endif
26 29
27bool EnablePrivilege(LPCTSTR privilegeName, bool enable) 30bool EnablePrivilege(LPCTSTR privilegeName, bool enable)
@@ -30,13 +33,19 @@ bool EnablePrivilege(LPCTSTR privilegeName, bool enable)
30 33
31 #ifndef _UNICODE 34 #ifndef _UNICODE
32 35
33 HMODULE hModule = ::LoadLibrary(TEXT("Advapi32.dll")); 36 const HMODULE hModule = ::LoadLibrary(TEXT("advapi32.dll"));
34 if (hModule == NULL) 37 if (!hModule)
35 return false; 38 return false;
36 39
37 GET_PROC_ADDR(OpenProcessToken, "OpenProcessToken"); 40 GET_PROC_ADDR(
38 GET_PROC_ADDR(LookupPrivilegeValue, "LookupPrivilegeValueA"); 41 OpenProcessToken,
39 GET_PROC_ADDR(AdjustTokenPrivileges, "AdjustTokenPrivileges"); 42 "OpenProcessToken")
43 GET_PROC_ADDR(
44 LookupPrivilegeValue,
45 "LookupPrivilegeValueA")
46 GET_PROC_ADDR(
47 AdjustTokenPrivileges,
48 "AdjustTokenPrivileges")
40 49
41 if (my_OpenProcessToken && 50 if (my_OpenProcessToken &&
42 my_AdjustTokenPrivileges && 51 my_AdjustTokenPrivileges &&
@@ -85,10 +94,13 @@ typedef void (WINAPI * Func_RtlGetVersion) (OSVERSIONINFOEXW *);
85unsigned Get_LargePages_RiskLevel() 94unsigned Get_LargePages_RiskLevel()
86{ 95{
87 OSVERSIONINFOEXW vi; 96 OSVERSIONINFOEXW vi;
88 HMODULE ntdll = ::GetModuleHandleW(L"ntdll.dll"); 97 const HMODULE ntdll = ::GetModuleHandleW(L"ntdll.dll");
89 if (!ntdll) 98 if (!ntdll)
90 return 0; 99 return 0;
91 Func_RtlGetVersion func = (Func_RtlGetVersion)(void *)GetProcAddress(ntdll, "RtlGetVersion"); 100 const
101 Func_RtlGetVersion func = Z7_GET_PROC_ADDRESS(
102 Func_RtlGetVersion, ntdll,
103 "RtlGetVersion");
92 if (!func) 104 if (!func)
93 return 0; 105 return 0;
94 func(&vi); 106 func(&vi);
diff --git a/CPP/Windows/MemoryLock.h b/CPP/Windows/MemoryLock.h
index dcaf182..2b85002 100644
--- a/CPP/Windows/MemoryLock.h
+++ b/CPP/Windows/MemoryLock.h
@@ -1,7 +1,7 @@
1// Windows/MemoryLock.h 1// Windows/MemoryLock.h
2 2
3#ifndef __WINDOWS_MEMORY_LOCK_H 3#ifndef ZIP7_INC_WINDOWS_MEMORY_LOCK_H
4#define __WINDOWS_MEMORY_LOCK_H 4#define ZIP7_INC_WINDOWS_MEMORY_LOCK_H
5 5
6#include "../Common/MyWindows.h" 6#include "../Common/MyWindows.h"
7 7
diff --git a/CPP/Windows/Menu.cpp b/CPP/Windows/Menu.cpp
index 3ad6953..af54c66 100644
--- a/CPP/Windows/Menu.cpp
+++ b/CPP/Windows/Menu.cpp
@@ -22,8 +22,23 @@ contain additional member:
22 HBITMAP hbmpItem; 22 HBITMAP hbmpItem;
23 #endif 23 #endif
24If we compile the source code with (WINVER >= 0x0500), some functions 24If we compile the source code with (WINVER >= 0x0500), some functions
25will not work at NT 4.0, if cbSize is set as sizeof(MENUITEMINFO*). 25will not work at NT4, if cbSize is set as sizeof(MENUITEMINFO).
26So we use size of old version of structure. */ 26So we use size of old version of structure in some conditions.
27Win98 probably supports full structure including hbmpItem.
28
29We have 2 ways to get/set string in menu item:
30win95/NT4: we must use MIIM_TYPE only.
31 MIIM_TYPE : Retrieves or sets the fType and dwTypeData members.
32win98/win2000: there are new flags that can be used instead of MIIM_TYPE:
33 MIIM_FTYPE : Retrieves or sets the fType member.
34 MIIM_STRING : Retrieves or sets the dwTypeData member.
35
36Windows versions probably support MIIM_TYPE flag, if we set MENUITEMINFO::cbSize
37as sizeof of old (small) MENUITEMINFO that doesn't include (hbmpItem) field.
38But do all Windows versions support old MIIM_TYPE flag, if we use
39MENUITEMINFO::cbSize as sizeof of new (big) MENUITEMINFO including (hbmpItem) field ?
40win10 probably supports any combination of small/big (cbSize) and old/new MIIM_TYPE/MIIM_STRING.
41*/
27 42
28#if defined(UNDER_CE) || defined(_WIN64) || (WINVER < 0x0500) 43#if defined(UNDER_CE) || defined(_WIN64) || (WINVER < 0x0500)
29 #ifndef _UNICODE 44 #ifndef _UNICODE
@@ -36,20 +51,31 @@ So we use size of old version of structure. */
36 #define my_compatib_MENUITEMINFOA_size MY_STRUCT_SIZE_BEFORE(MENUITEMINFOA, hbmpItem) 51 #define my_compatib_MENUITEMINFOA_size MY_STRUCT_SIZE_BEFORE(MENUITEMINFOA, hbmpItem)
37 #endif 52 #endif
38 #define my_compatib_MENUITEMINFOW_size MY_STRUCT_SIZE_BEFORE(MENUITEMINFOW, hbmpItem) 53 #define my_compatib_MENUITEMINFOW_size MY_STRUCT_SIZE_BEFORE(MENUITEMINFOW, hbmpItem)
54#if defined(__clang__) && __clang_major__ >= 13
55// error : performing pointer subtraction with a null pointer may have undefined behavior
56#pragma GCC diagnostic ignored "-Wnull-pointer-subtraction"
39#endif 57#endif
58#endif
59
60
61#define COPY_MENUITEM_field(d, s, name) \
62 d.name = s.name;
63
64#define COPY_MENUITEM_fields(d, s) \
65 COPY_MENUITEM_field(d, s, fMask) \
66 COPY_MENUITEM_field(d, s, fType) \
67 COPY_MENUITEM_field(d, s, fState) \
68 COPY_MENUITEM_field(d, s, wID) \
69 COPY_MENUITEM_field(d, s, hSubMenu) \
70 COPY_MENUITEM_field(d, s, hbmpChecked) \
71 COPY_MENUITEM_field(d, s, hbmpUnchecked) \
72 COPY_MENUITEM_field(d, s, dwItemData) \
40 73
41static void ConvertItemToSysForm(const CMenuItem &item, MENUITEMINFOW &si) 74static void ConvertItemToSysForm(const CMenuItem &item, MENUITEMINFOW &si)
42{ 75{
43 ZeroMemory(&si, sizeof(si)); 76 ZeroMemory(&si, sizeof(si));
44 si.cbSize = my_compatib_MENUITEMINFOW_size; // sizeof(si); 77 si.cbSize = my_compatib_MENUITEMINFOW_size; // sizeof(si);
45 si.fMask = item.fMask; 78 COPY_MENUITEM_fields(si, item)
46 si.fType = item.fType;
47 si.fState = item.fState;
48 si.wID = item.wID;
49 si.hSubMenu = item.hSubMenu;
50 si.hbmpChecked = item.hbmpChecked;
51 si.hbmpUnchecked = item.hbmpUnchecked;
52 si.dwItemData = item.dwItemData;
53} 79}
54 80
55#ifndef _UNICODE 81#ifndef _UNICODE
@@ -57,62 +83,63 @@ static void ConvertItemToSysForm(const CMenuItem &item, MENUITEMINFOA &si)
57{ 83{
58 ZeroMemory(&si, sizeof(si)); 84 ZeroMemory(&si, sizeof(si));
59 si.cbSize = my_compatib_MENUITEMINFOA_size; // sizeof(si); 85 si.cbSize = my_compatib_MENUITEMINFOA_size; // sizeof(si);
60 si.fMask = item.fMask; 86 COPY_MENUITEM_fields(si, item)
61 si.fType = item.fType;
62 si.fState = item.fState;
63 si.wID = item.wID;
64 si.hSubMenu = item.hSubMenu;
65 si.hbmpChecked = item.hbmpChecked;
66 si.hbmpUnchecked = item.hbmpUnchecked;
67 si.dwItemData = item.dwItemData;
68} 87}
69#endif 88#endif
70 89
71static void ConvertItemToMyForm(const MENUITEMINFOW &si, CMenuItem &item) 90static void ConvertItemToMyForm(const MENUITEMINFOW &si, CMenuItem &item)
72{ 91{
73 item.fMask = si.fMask; 92 COPY_MENUITEM_fields(item, si)
74 item.fType = si.fType;
75 item.fState = si.fState;
76 item.wID = si.wID;
77 item.hSubMenu = si.hSubMenu;
78 item.hbmpChecked = si.hbmpChecked;
79 item.hbmpUnchecked = si.hbmpUnchecked;
80 item.dwItemData = si.dwItemData;
81} 93}
82 94
83#ifndef _UNICODE 95#ifndef _UNICODE
84static void ConvertItemToMyForm(const MENUITEMINFOA &si, CMenuItem &item) 96static void ConvertItemToMyForm(const MENUITEMINFOA &si, CMenuItem &item)
85{ 97{
86 item.fMask = si.fMask; 98 COPY_MENUITEM_fields(item, si)
87 item.fType = si.fType;
88 item.fState = si.fState;
89 item.wID = si.wID;
90 item.hSubMenu = si.hSubMenu;
91 item.hbmpChecked = si.hbmpChecked;
92 item.hbmpUnchecked = si.hbmpUnchecked;
93 item.dwItemData = si.dwItemData;
94} 99}
95#endif 100#endif
96 101
97bool CMenu::GetItem(UINT itemIndex, bool byPosition, CMenuItem &item) 102
103bool CMenu::GetItem(UINT itemIndex, bool byPosition, CMenuItem &item) const
98{ 104{
99 const UINT kMaxSize = 512; 105 item.StringValue.Empty();
106 const unsigned kMaxSize = 512;
100 #ifndef _UNICODE 107 #ifndef _UNICODE
101 if (!g_IsNT) 108 if (!g_IsNT)
102 { 109 {
103 CHAR s[kMaxSize + 1];
104 MENUITEMINFOA si; 110 MENUITEMINFOA si;
105 ConvertItemToSysForm(item, si); 111 ConvertItemToSysForm(item, si);
106 if (item.IsString()) 112 const bool isString = item.IsString();
113 unsigned bufSize = kMaxSize;
114 AString a;
115 if (isString)
107 { 116 {
108 si.cch = kMaxSize; 117 si.cch = bufSize;
109 si.dwTypeData = s; 118 si.dwTypeData = a.GetBuf(bufSize);
110 } 119 }
111 if (GetItemInfo(itemIndex, byPosition, &si)) 120 bool res = GetItemInfo(itemIndex, byPosition, &si);
121 if (isString)
122 a.ReleaseBuf_CalcLen(bufSize);
123 if (!res)
124 return false;
112 { 125 {
126 if (isString && si.cch >= bufSize - 1)
127 {
128 si.dwTypeData = NULL;
129 res = GetItemInfo(itemIndex, byPosition, &si);
130 if (!res)
131 return false;
132 si.cch++;
133 bufSize = si.cch;
134 si.dwTypeData = a.GetBuf(bufSize);
135 res = GetItemInfo(itemIndex, byPosition, &si);
136 a.ReleaseBuf_CalcLen(bufSize);
137 if (!res)
138 return false;
139 }
113 ConvertItemToMyForm(si, item); 140 ConvertItemToMyForm(si, item);
114 if (item.IsString()) 141 if (isString)
115 item.StringValue = GetUnicodeString(s); 142 item.StringValue = GetUnicodeString(a);
116 return true; 143 return true;
117 } 144 }
118 } 145 }
@@ -120,24 +147,45 @@ bool CMenu::GetItem(UINT itemIndex, bool byPosition, CMenuItem &item)
120 #endif 147 #endif
121 { 148 {
122 wchar_t s[kMaxSize + 1]; 149 wchar_t s[kMaxSize + 1];
150 s[0] = 0;
123 MENUITEMINFOW si; 151 MENUITEMINFOW si;
124 ConvertItemToSysForm(item, si); 152 ConvertItemToSysForm(item, si);
125 if (item.IsString()) 153 const bool isString = item.IsString();
154 unsigned bufSize = kMaxSize;
155 if (isString)
126 { 156 {
127 si.cch = kMaxSize; 157 si.cch = bufSize;
128 si.dwTypeData = s; 158 si.dwTypeData = s;
129 } 159 }
130 if (GetItemInfo(itemIndex, byPosition, &si)) 160 bool res = GetItemInfo(itemIndex, byPosition, &si);
161 if (!res)
162 return false;
163 if (isString)
131 { 164 {
132 ConvertItemToMyForm(si, item); 165 s[Z7_ARRAY_SIZE(s) - 1] = 0;
133 if (item.IsString()) 166 item.StringValue = s;
134 item.StringValue = s; 167 if (si.cch >= bufSize - 1)
135 return true; 168 {
169 si.dwTypeData = NULL;
170 res = GetItemInfo(itemIndex, byPosition, &si);
171 if (!res)
172 return false;
173 si.cch++;
174 bufSize = si.cch;
175 si.dwTypeData = item.StringValue.GetBuf(bufSize);
176 res = GetItemInfo(itemIndex, byPosition, &si);
177 item.StringValue.ReleaseBuf_CalcLen(bufSize);
178 if (!res)
179 return false;
180 }
181 // if (item.StringValue.Len() != si.cch) throw 123; // for debug
136 } 182 }
183 ConvertItemToMyForm(si, item);
184 return true;
137 } 185 }
138 return false;
139} 186}
140 187
188
141bool CMenu::SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item) 189bool CMenu::SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item)
142{ 190{
143 #ifndef _UNICODE 191 #ifndef _UNICODE
@@ -164,6 +212,7 @@ bool CMenu::SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item)
164 } 212 }
165} 213}
166 214
215
167bool CMenu::InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item) 216bool CMenu::InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item)
168{ 217{
169 #ifndef _UNICODE 218 #ifndef _UNICODE
@@ -188,11 +237,11 @@ bool CMenu::InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item)
188 si.dwTypeData = item.StringValue.Ptr_non_const(); 237 si.dwTypeData = item.StringValue.Ptr_non_const();
189 #ifdef UNDER_CE 238 #ifdef UNDER_CE
190 UINT flags = (item.fType & MFT_SEPARATOR) ? MF_SEPARATOR : MF_STRING; 239 UINT flags = (item.fType & MFT_SEPARATOR) ? MF_SEPARATOR : MF_STRING;
191 UINT id = item.wID; 240 UINT_PTR id = item.wID;
192 if ((item.fMask & MIIM_SUBMENU) != 0) 241 if ((item.fMask & MIIM_SUBMENU) != 0)
193 { 242 {
194 flags |= MF_POPUP; 243 flags |= MF_POPUP;
195 id = (UINT)item.hSubMenu; 244 id = (UINT_PTR)item.hSubMenu;
196 } 245 }
197 if (!Insert(itemIndex, flags | (byPosition ? MF_BYPOSITION : MF_BYCOMMAND), id, item.StringValue)) 246 if (!Insert(itemIndex, flags | (byPosition ? MF_BYPOSITION : MF_BYCOMMAND), id, item.StringValue))
198 return false; 247 return false;
diff --git a/CPP/Windows/Menu.h b/CPP/Windows/Menu.h
index aacdc7c..e1de4c4 100644
--- a/CPP/Windows/Menu.h
+++ b/CPP/Windows/Menu.h
@@ -1,14 +1,27 @@
1// Windows/Menu.h 1// Windows/Menu.h
2 2
3#ifndef __WINDOWS_MENU_H 3#ifndef ZIP7_INC_WINDOWS_MENU_H
4#define __WINDOWS_MENU_H 4#define ZIP7_INC_WINDOWS_MENU_H
5 5
6#include "../Common/MyWindows.h"
6#include "../Common/MyString.h" 7#include "../Common/MyString.h"
7 8
8#include "Defs.h" 9#include "Defs.h"
9 10
10namespace NWindows { 11namespace NWindows {
11 12
13#ifndef MIIM_STRING
14#define MIIM_STRING 0x00000040
15#endif
16/*
17#ifndef MIIM_BITMAP
18#define MIIM_BITMAP 0x00000080
19#endif
20*/
21#ifndef MIIM_FTYPE
22#define MIIM_FTYPE 0x00000100
23#endif
24
12struct CMenuItem 25struct CMenuItem
13{ 26{
14 UString StringValue; 27 UString StringValue;
@@ -23,24 +36,23 @@ struct CMenuItem
23 // LPTSTR dwTypeData; 36 // LPTSTR dwTypeData;
24 // UINT cch; 37 // UINT cch;
25 // HBITMAP hbmpItem; 38 // HBITMAP hbmpItem;
26 bool IsString() const // change it MIIM_STRING 39 bool IsString() const { return (fMask & (MIIM_TYPE | MIIM_STRING)) != 0; }
27 { return ((fMask & MIIM_TYPE) != 0 && (fType == MFT_STRING)); }
28 bool IsSeparator() const { return (fType == MFT_SEPARATOR); } 40 bool IsSeparator() const { return (fType == MFT_SEPARATOR); }
29 CMenuItem(): fMask(0), fType(0), fState(0), wID(0), hSubMenu(0), hbmpChecked(0), 41 CMenuItem(): fMask(0), fType(0), fState(0), wID(0),
30 hbmpUnchecked(0), dwItemData(0) {} 42 hSubMenu(NULL), hbmpChecked(NULL), hbmpUnchecked(NULL), dwItemData(0) {}
31}; 43};
32 44
33class CMenu 45class CMenu
34{ 46{
35 HMENU _menu; 47 HMENU _menu;
36public: 48public:
37 CMenu(): _menu(NULL) {}; 49 CMenu(): _menu(NULL) {}
38 operator HMENU() const { return _menu; } 50 operator HMENU() const { return _menu; }
39 void Attach(HMENU menu) { _menu = menu; } 51 void Attach(HMENU menu) { _menu = menu; }
40 52
41 HMENU Detach() 53 HMENU Detach()
42 { 54 {
43 HMENU menu = _menu; 55 const HMENU menu = _menu;
44 _menu = NULL; 56 _menu = NULL;
45 return menu; 57 return menu;
46 } 58 }
@@ -59,27 +71,27 @@ public:
59 71
60 bool Destroy() 72 bool Destroy()
61 { 73 {
62 if (_menu == NULL) 74 if (!_menu)
63 return false; 75 return false;
64 return BOOLToBool(::DestroyMenu(Detach())); 76 return BOOLToBool(::DestroyMenu(Detach()));
65 } 77 }
66 78
67 int GetItemCount() 79 int GetItemCount() const
68 { 80 {
69 #ifdef UNDER_CE 81 #ifdef UNDER_CE
70 for (int i = 0;; i++) 82 for (unsigned i = 0;; i++)
71 { 83 {
72 CMenuItem item; 84 CMenuItem item;
73 item.fMask = MIIM_STATE; 85 item.fMask = MIIM_STATE;
74 if (!GetItem(i, true, item)) 86 if (!GetItem(i, true, item))
75 return i; 87 return (int)i;
76 } 88 }
77 #else 89 #else
78 return GetMenuItemCount(_menu); 90 return GetMenuItemCount(_menu);
79 #endif 91 #endif
80 } 92 }
81 93
82 HMENU GetSubMenu(int pos) { return ::GetSubMenu(_menu, pos); } 94 HMENU GetSubMenu(int pos) const { return ::GetSubMenu(_menu, pos); }
83 #ifndef UNDER_CE 95 #ifndef UNDER_CE
84 /* 96 /*
85 bool GetItemString(UINT idItem, UINT flag, CSysString &result) 97 bool GetItemString(UINT idItem, UINT flag, CSysString &result)
@@ -93,11 +105,11 @@ public:
93 return (len != 0); 105 return (len != 0);
94 } 106 }
95 */ 107 */
96 UINT GetItemID(int pos) { return ::GetMenuItemID(_menu, pos); } 108 UINT GetItemID(int pos) const { return ::GetMenuItemID(_menu, pos); }
97 UINT GetItemState(UINT id, UINT flags) { return ::GetMenuState(_menu, id, flags); } 109 UINT GetItemState(UINT id, UINT flags) const { return ::GetMenuState(_menu, id, flags); }
98 #endif 110 #endif
99 111
100 bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo) 112 bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo) const
101 { return BOOLToBool(::GetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } 113 { return BOOLToBool(::GetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
102 bool SetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo) 114 bool SetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFO itemInfo)
103 { return BOOLToBool(::SetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } 115 { return BOOLToBool(::SetMenuItemInfo(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
@@ -118,7 +130,7 @@ public:
118 void RemoveAllItems() { RemoveAllItemsFrom(0); } 130 void RemoveAllItems() { RemoveAllItemsFrom(0); }
119 131
120 #ifndef _UNICODE 132 #ifndef _UNICODE
121 bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo) 133 bool GetItemInfo(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo) const
122 { return BOOLToBool(::GetMenuItemInfoW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } 134 { return BOOLToBool(::GetMenuItemInfoW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
123 bool InsertItem(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo) 135 bool InsertItem(UINT itemIndex, bool byPosition, LPMENUITEMINFOW itemInfo)
124 { return BOOLToBool(::InsertMenuItemW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); } 136 { return BOOLToBool(::InsertMenuItemW(_menu, itemIndex, BoolToBOOL(byPosition), itemInfo)); }
@@ -127,7 +139,7 @@ public:
127 bool AppendItem(UINT flags, UINT_PTR newItemID, LPCWSTR newItem); 139 bool AppendItem(UINT flags, UINT_PTR newItemID, LPCWSTR newItem);
128 #endif 140 #endif
129 141
130 bool GetItem(UINT itemIndex, bool byPosition, CMenuItem &item); 142 bool GetItem(UINT itemIndex, bool byPosition, CMenuItem &item) const;
131 bool SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item); 143 bool SetItem(UINT itemIndex, bool byPosition, const CMenuItem &item);
132 bool InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item); 144 bool InsertItem(UINT itemIndex, bool byPosition, const CMenuItem &item);
133 145
@@ -147,10 +159,10 @@ class CMenuDestroyer
147 CMenu *_menu; 159 CMenu *_menu;
148public: 160public:
149 CMenuDestroyer(CMenu &menu): _menu(&menu) {} 161 CMenuDestroyer(CMenu &menu): _menu(&menu) {}
150 CMenuDestroyer(): _menu(0) {} 162 CMenuDestroyer(): _menu(NULL) {}
151 ~CMenuDestroyer() { if (_menu) _menu->Destroy(); } 163 ~CMenuDestroyer() { if (_menu) _menu->Destroy(); }
152 void Attach(CMenu &menu) { _menu = &menu; } 164 void Attach(CMenu &menu) { _menu = &menu; }
153 void Disable() { _menu = 0; } 165 void Disable() { _menu = NULL; }
154}; 166};
155 167
156} 168}
diff --git a/CPP/Windows/NationalTime.cpp b/CPP/Windows/NationalTime.cpp
index 0dcd31e..d3c38de 100644
--- a/CPP/Windows/NationalTime.cpp
+++ b/CPP/Windows/NationalTime.cpp
@@ -16,8 +16,8 @@ bool MyGetTimeFormat(LCID locale, DWORD flags, CONST SYSTEMTIME *time,
16 if (numChars == 0) 16 if (numChars == 0)
17 return false; 17 return false;
18 numChars = ::GetTimeFormat(locale, flags, time, format, 18 numChars = ::GetTimeFormat(locale, flags, time, format,
19 resultString.GetBuf(numChars), numChars + 1); 19 resultString.GetBuf((unsigned)numChars), numChars + 1);
20 resultString.ReleaseBuf_CalcLen(numChars); 20 resultString.ReleaseBuf_CalcLen((unsigned)numChars);
21 return (numChars != 0); 21 return (numChars != 0);
22} 22}
23 23
@@ -29,8 +29,8 @@ bool MyGetDateFormat(LCID locale, DWORD flags, CONST SYSTEMTIME *time,
29 if (numChars == 0) 29 if (numChars == 0)
30 return false; 30 return false;
31 numChars = ::GetDateFormat(locale, flags, time, format, 31 numChars = ::GetDateFormat(locale, flags, time, format,
32 resultString.GetBuf(numChars), numChars + 1); 32 resultString.GetBuf((unsigned)numChars), numChars + 1);
33 resultString.ReleaseBuf_CalcLen(numChars); 33 resultString.ReleaseBuf_CalcLen((unsigned)numChars);
34 return (numChars != 0); 34 return (numChars != 0);
35} 35}
36 36
diff --git a/CPP/Windows/NationalTime.h b/CPP/Windows/NationalTime.h
index 49b0e5e..32ba479 100644
--- a/CPP/Windows/NationalTime.h
+++ b/CPP/Windows/NationalTime.h
@@ -1,7 +1,7 @@
1// Windows/NationalTime.h 1// Windows/NationalTime.h
2 2
3#ifndef __WINDOWS_NATIONAL_TIME_H 3#ifndef ZIP7_INC_WINDOWS_NATIONAL_TIME_H
4#define __WINDOWS_NATIONAL_TIME_H 4#define ZIP7_INC_WINDOWS_NATIONAL_TIME_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7 7
diff --git a/CPP/Windows/Net.cpp b/CPP/Windows/Net.cpp
index 2a3952a..0ac82d4 100644
--- a/CPP/Windows/Net.cpp
+++ b/CPP/Windows/Net.cpp
@@ -14,13 +14,41 @@
14extern bool g_IsNT; 14extern bool g_IsNT;
15#endif 15#endif
16 16
17extern "C"
18{
19#if !defined(WNetGetResourceParent)
20// #if defined(Z7_OLD_WIN_SDK)
21// #if (WINVER >= 0x0400)
22DWORD APIENTRY WNetGetResourceParentA(IN LPNETRESOURCEA lpNetResource,
23 OUT LPVOID lpBuffer, IN OUT LPDWORD lpcbBuffer);
24DWORD APIENTRY WNetGetResourceParentW(IN LPNETRESOURCEW lpNetResource,
25 OUT LPVOID lpBuffer, IN OUT LPDWORD lpcbBuffer);
26#ifdef UNICODE
27#define WNetGetResourceParent WNetGetResourceParentW
28#else
29#define WNetGetResourceParent WNetGetResourceParentA
30#endif
31
32DWORD APIENTRY WNetGetResourceInformationA(IN LPNETRESOURCEA lpNetResource,
33 OUT LPVOID lpBuffer, IN OUT LPDWORD lpcbBuffer, OUT LPSTR *lplpSystem);
34DWORD APIENTRY WNetGetResourceInformationW(IN LPNETRESOURCEW lpNetResource,
35 OUT LPVOID lpBuffer, IN OUT LPDWORD lpcbBuffer, OUT LPWSTR *lplpSystem);
36#ifdef UNICODE
37#define WNetGetResourceInformation WNetGetResourceInformationW
38#else
39#define WNetGetResourceInformation WNetGetResourceInformationA
40#endif
41// #endif // (WINVER >= 0x0400)
42#endif
43}
44
17namespace NWindows { 45namespace NWindows {
18namespace NNet { 46namespace NNet {
19 47
20DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCE netResource) 48DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCE netResource)
21{ 49{
22 Close(); 50 Close();
23 DWORD result = ::WNetOpenEnum(scope, type, usage, netResource, &_handle); 51 const DWORD result = ::WNetOpenEnum(scope, type, usage, netResource, &_handle);
24 _handleAllocated = (result == NO_ERROR); 52 _handleAllocated = (result == NO_ERROR);
25 return result; 53 return result;
26} 54}
@@ -29,7 +57,7 @@ DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCE netResourc
29DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCEW netResource) 57DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCEW netResource)
30{ 58{
31 Close(); 59 Close();
32 DWORD result = ::WNetOpenEnumW(scope, type, usage, netResource, &_handle); 60 const DWORD result = ::WNetOpenEnumW(scope, type, usage, netResource, &_handle);
33 _handleAllocated = (result == NO_ERROR); 61 _handleAllocated = (result == NO_ERROR);
34 return result; 62 return result;
35} 63}
@@ -37,7 +65,7 @@ DWORD CEnum::Open(DWORD scope, DWORD type, DWORD usage, LPNETRESOURCEW netResour
37 65
38static void SetComplexString(bool &defined, CSysString &destString, LPCTSTR srcString) 66static void SetComplexString(bool &defined, CSysString &destString, LPCTSTR srcString)
39{ 67{
40 defined = (srcString != 0); 68 defined = (srcString != NULL);
41 if (defined) 69 if (defined)
42 destString = srcString; 70 destString = srcString;
43 else 71 else
@@ -179,7 +207,7 @@ DWORD CEnum::Close()
179{ 207{
180 if (!_handleAllocated) 208 if (!_handleAllocated)
181 return NO_ERROR; 209 return NO_ERROR;
182 DWORD result = ::WNetCloseEnum(_handle); 210 const DWORD result = ::WNetCloseEnum(_handle);
183 _handleAllocated = (result != NO_ERROR); 211 _handleAllocated = (result != NO_ERROR);
184 return result; 212 return result;
185} 213}
@@ -204,7 +232,7 @@ DWORD CEnum::Next(CResource &resource)
204 ZeroMemory(lpnrLocal, kBufferSize); 232 ZeroMemory(lpnrLocal, kBufferSize);
205 DWORD bufferSize = kBufferSize; 233 DWORD bufferSize = kBufferSize;
206 DWORD numEntries = 1; 234 DWORD numEntries = 1;
207 DWORD result = Next(&numEntries, lpnrLocal, &bufferSize); 235 const DWORD result = Next(&numEntries, lpnrLocal, &bufferSize);
208 if (result != NO_ERROR) 236 if (result != NO_ERROR)
209 return result; 237 return result;
210 if (numEntries != 1) 238 if (numEntries != 1)
@@ -224,7 +252,7 @@ DWORD CEnum::Next(CResourceW &resource)
224 ZeroMemory(lpnrLocal, kBufferSize); 252 ZeroMemory(lpnrLocal, kBufferSize);
225 DWORD bufferSize = kBufferSize; 253 DWORD bufferSize = kBufferSize;
226 DWORD numEntries = 1; 254 DWORD numEntries = 1;
227 DWORD result = NextW(&numEntries, lpnrLocal, &bufferSize); 255 const DWORD result = NextW(&numEntries, lpnrLocal, &bufferSize);
228 if (result != NO_ERROR) 256 if (result != NO_ERROR)
229 return result; 257 return result;
230 if (numEntries != 1) 258 if (numEntries != 1)
@@ -233,7 +261,7 @@ DWORD CEnum::Next(CResourceW &resource)
233 return result; 261 return result;
234 } 262 }
235 CResource resourceA; 263 CResource resourceA;
236 DWORD result = Next(resourceA); 264 const DWORD result = Next(resourceA);
237 ConvertResourceToResourceW(resourceA, resource); 265 ConvertResourceToResourceW(resourceA, resource);
238 return result; 266 return result;
239} 267}
@@ -249,7 +277,7 @@ DWORD GetResourceParent(const CResource &resource, CResource &parentResource)
249 DWORD bufferSize = kBufferSize; 277 DWORD bufferSize = kBufferSize;
250 NETRESOURCE netResource; 278 NETRESOURCE netResource;
251 ConvertCResourceToNETRESOURCE(resource, netResource); 279 ConvertCResourceToNETRESOURCE(resource, netResource);
252 DWORD result = ::WNetGetResourceParent(&netResource, lpnrLocal, &bufferSize); 280 const DWORD result = ::WNetGetResourceParent(&netResource, lpnrLocal, &bufferSize);
253 if (result != NO_ERROR) 281 if (result != NO_ERROR)
254 return result; 282 return result;
255 ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource); 283 ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource);
@@ -268,7 +296,7 @@ DWORD GetResourceParent(const CResourceW &resource, CResourceW &parentResource)
268 DWORD bufferSize = kBufferSize; 296 DWORD bufferSize = kBufferSize;
269 NETRESOURCEW netResource; 297 NETRESOURCEW netResource;
270 ConvertCResourceToNETRESOURCE(resource, netResource); 298 ConvertCResourceToNETRESOURCE(resource, netResource);
271 DWORD result = ::WNetGetResourceParentW(&netResource, lpnrLocal, &bufferSize); 299 const DWORD result = ::WNetGetResourceParentW(&netResource, lpnrLocal, &bufferSize);
272 if (result != NO_ERROR) 300 if (result != NO_ERROR)
273 return result; 301 return result;
274 ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource); 302 ConvertNETRESOURCEToCResource(lpnrLocal[0], parentResource);
@@ -276,7 +304,7 @@ DWORD GetResourceParent(const CResourceW &resource, CResourceW &parentResource)
276 } 304 }
277 CResource resourceA, parentResourceA; 305 CResource resourceA, parentResourceA;
278 ConvertResourceWToResource(resource, resourceA); 306 ConvertResourceWToResource(resource, resourceA);
279 DWORD result = GetResourceParent(resourceA, parentResourceA); 307 const DWORD result = GetResourceParent(resourceA, parentResourceA);
280 ConvertResourceToResourceW(parentResourceA, parentResource); 308 ConvertResourceToResourceW(parentResourceA, parentResource);
281 return result; 309 return result;
282} 310}
@@ -293,11 +321,11 @@ DWORD GetResourceInformation(const CResource &resource,
293 NETRESOURCE netResource; 321 NETRESOURCE netResource;
294 ConvertCResourceToNETRESOURCE(resource, netResource); 322 ConvertCResourceToNETRESOURCE(resource, netResource);
295 LPTSTR lplpSystem; 323 LPTSTR lplpSystem;
296 DWORD result = ::WNetGetResourceInformation(&netResource, 324 const DWORD result = ::WNetGetResourceInformation(&netResource,
297 lpnrLocal, &bufferSize, &lplpSystem); 325 lpnrLocal, &bufferSize, &lplpSystem);
298 if (result != NO_ERROR) 326 if (result != NO_ERROR)
299 return result; 327 return result;
300 if (lplpSystem != 0) 328 if (lplpSystem != NULL)
301 systemPathPart = lplpSystem; 329 systemPathPart = lplpSystem;
302 ConvertNETRESOURCEToCResource(lpnrLocal[0], destResource); 330 ConvertNETRESOURCEToCResource(lpnrLocal[0], destResource);
303 return result; 331 return result;
@@ -317,7 +345,7 @@ DWORD GetResourceInformation(const CResourceW &resource,
317 NETRESOURCEW netResource; 345 NETRESOURCEW netResource;
318 ConvertCResourceToNETRESOURCE(resource, netResource); 346 ConvertCResourceToNETRESOURCE(resource, netResource);
319 LPWSTR lplpSystem; 347 LPWSTR lplpSystem;
320 DWORD result = ::WNetGetResourceInformationW(&netResource, 348 const DWORD result = ::WNetGetResourceInformationW(&netResource,
321 lpnrLocal, &bufferSize, &lplpSystem); 349 lpnrLocal, &bufferSize, &lplpSystem);
322 if (result != NO_ERROR) 350 if (result != NO_ERROR)
323 return result; 351 return result;
@@ -329,7 +357,7 @@ DWORD GetResourceInformation(const CResourceW &resource,
329 CResource resourceA, destResourceA; 357 CResource resourceA, destResourceA;
330 ConvertResourceWToResource(resource, resourceA); 358 ConvertResourceWToResource(resource, resourceA);
331 AString systemPathPartA; 359 AString systemPathPartA;
332 DWORD result = GetResourceInformation(resourceA, destResourceA, systemPathPartA); 360 const DWORD result = GetResourceInformation(resourceA, destResourceA, systemPathPartA);
333 ConvertResourceToResourceW(destResourceA, destResource); 361 ConvertResourceToResourceW(destResourceA, destResource);
334 systemPathPart = GetUnicodeString(systemPathPartA); 362 systemPathPart = GetUnicodeString(systemPathPartA);
335 return result; 363 return result;
diff --git a/CPP/Windows/Net.h b/CPP/Windows/Net.h
index 7b60b1b..a954bdb 100644
--- a/CPP/Windows/Net.h
+++ b/CPP/Windows/Net.h
@@ -1,9 +1,10 @@
1// Windows/Net.h 1// Windows/Net.h
2 2
3#ifndef __WINDOWS_NET_H 3#ifndef ZIP7_INC_WINDOWS_NET_H
4#define __WINDOWS_NET_H 4#define ZIP7_INC_WINDOWS_NET_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7#include "../Common/MyWindows.h"
7 8
8namespace NWindows { 9namespace NWindows {
9namespace NNet { 10namespace NNet {
diff --git a/CPP/Windows/NtCheck.h b/CPP/Windows/NtCheck.h
index 0af3291..362a05a 100644
--- a/CPP/Windows/NtCheck.h
+++ b/CPP/Windows/NtCheck.h
@@ -1,19 +1,29 @@
1// Windows/NtCheck.h 1// Windows/NtCheck.h
2 2
3#ifndef __WINDOWS_NT_CHECK_H 3#ifndef ZIP7_INC_WINDOWS_NT_CHECK_H
4#define __WINDOWS_NT_CHECK_H 4#define ZIP7_INC_WINDOWS_NT_CHECK_H
5 5
6#ifdef _WIN32 6#ifdef _WIN32
7 7
8#include "../Common/MyWindows.h" 8#include "../Common/MyWindows.h"
9 9
10#if !defined(_WIN64) && !defined(UNDER_CE) 10#if !defined(_WIN64) && !defined(UNDER_CE)
11
12#if defined(_MSC_VER) && _MSC_VER >= 1900
13#pragma warning(push)
14// GetVersionExW was declared deprecated
15#pragma warning(disable : 4996)
16#endif
11static inline bool IsItWindowsNT() 17static inline bool IsItWindowsNT()
12{ 18{
13 OSVERSIONINFO vi; 19 OSVERSIONINFO vi;
14 vi.dwOSVersionInfoSize = sizeof(vi); 20 vi.dwOSVersionInfoSize = sizeof(vi);
15 return (::GetVersionEx(&vi) && vi.dwPlatformId == VER_PLATFORM_WIN32_NT); 21 return (::GetVersionEx(&vi) && vi.dwPlatformId == VER_PLATFORM_WIN32_NT);
16} 22}
23#if defined(_MSC_VER) && _MSC_VER >= 1900
24#pragma warning(pop)
25#endif
26
17#endif 27#endif
18 28
19#ifndef _UNICODE 29#ifndef _UNICODE
diff --git a/CPP/Windows/ProcessMessages.h b/CPP/Windows/ProcessMessages.h
index b2558a0..aa98bbb 100644
--- a/CPP/Windows/ProcessMessages.h
+++ b/CPP/Windows/ProcessMessages.h
@@ -1,7 +1,7 @@
1// Windows/ProcessMessages.h 1// Windows/ProcessMessages.h
2 2
3#ifndef __WINDOWS_PROCESSMESSAGES_H 3#ifndef ZIP7_INC_WINDOWS_PROCESS_MESSAGES_H
4#define __WINDOWS_PROCESSMESSAGES_H 4#define ZIP7_INC_WINDOWS_PROCESS_MESSAGES_H
5 5
6namespace NWindows { 6namespace NWindows {
7 7
diff --git a/CPP/Windows/ProcessUtils.cpp b/CPP/Windows/ProcessUtils.cpp
index 9bf0538..607b4bb 100644
--- a/CPP/Windows/ProcessUtils.cpp
+++ b/CPP/Windows/ProcessUtils.cpp
@@ -46,9 +46,9 @@ WRes CProcess::Create(LPCWSTR imageName, const UString &params, LPCWSTR curDir)
46 #endif 46 #endif
47 params; 47 params;
48 #ifdef UNDER_CE 48 #ifdef UNDER_CE
49 curDir = 0; 49 curDir = NULL;
50 #else 50 #else
51 imageName = 0; 51 imageName = NULL;
52 #endif 52 #endif
53 PROCESS_INFORMATION pi; 53 PROCESS_INFORMATION pi;
54 BOOL result; 54 BOOL result;
@@ -57,12 +57,12 @@ WRes CProcess::Create(LPCWSTR imageName, const UString &params, LPCWSTR curDir)
57 { 57 {
58 STARTUPINFOA si; 58 STARTUPINFOA si;
59 si.cb = sizeof(si); 59 si.cb = sizeof(si);
60 si.lpReserved = 0; 60 si.lpReserved = NULL;
61 si.lpDesktop = 0; 61 si.lpDesktop = NULL;
62 si.lpTitle = 0; 62 si.lpTitle = NULL;
63 si.dwFlags = 0; 63 si.dwFlags = 0;
64 si.cbReserved2 = 0; 64 si.cbReserved2 = 0;
65 si.lpReserved2 = 0; 65 si.lpReserved2 = NULL;
66 66
67 CSysString curDirA; 67 CSysString curDirA;
68 if (curDir != 0) 68 if (curDir != 0)
@@ -76,12 +76,12 @@ WRes CProcess::Create(LPCWSTR imageName, const UString &params, LPCWSTR curDir)
76 { 76 {
77 STARTUPINFOW si; 77 STARTUPINFOW si;
78 si.cb = sizeof(si); 78 si.cb = sizeof(si);
79 si.lpReserved = 0; 79 si.lpReserved = NULL;
80 si.lpDesktop = 0; 80 si.lpDesktop = NULL;
81 si.lpTitle = 0; 81 si.lpTitle = NULL;
82 si.dwFlags = 0; 82 si.dwFlags = 0;
83 si.cbReserved2 = 0; 83 si.cbReserved2 = 0;
84 si.lpReserved2 = 0; 84 si.lpReserved2 = NULL;
85 85
86 result = CreateProcessW(imageName, params2.Ptr_non_const(), 86 result = CreateProcessW(imageName, params2.Ptr_non_const(),
87 NULL, NULL, FALSE, 0, NULL, curDir, &si, &pi); 87 NULL, NULL, FALSE, 0, NULL, curDir, &si, &pi);
@@ -96,7 +96,7 @@ WRes CProcess::Create(LPCWSTR imageName, const UString &params, LPCWSTR curDir)
96WRes MyCreateProcess(LPCWSTR imageName, const UString &params) 96WRes MyCreateProcess(LPCWSTR imageName, const UString &params)
97{ 97{
98 CProcess process; 98 CProcess process;
99 return process.Create(imageName, params, 0); 99 return process.Create(imageName, params, NULL);
100} 100}
101 101
102} 102}
diff --git a/CPP/Windows/ProcessUtils.h b/CPP/Windows/ProcessUtils.h
index e46f9ab..b1fce3a 100644
--- a/CPP/Windows/ProcessUtils.h
+++ b/CPP/Windows/ProcessUtils.h
@@ -1,9 +1,41 @@
1// Windows/ProcessUtils.h 1// Windows/ProcessUtils.h
2 2
3#ifndef __WINDOWS_PROCESS_UTILS_H 3#ifndef ZIP7_INC_WINDOWS_PROCESS_UTILS_H
4#define __WINDOWS_PROCESS_UTILS_H 4#define ZIP7_INC_WINDOWS_PROCESS_UTILS_H
5 5
6#include "../Common/MyWindows.h"
7
8#ifndef Z7_OLD_WIN_SDK
9
10#if defined(__MINGW32__) || defined(__MINGW64__)
11#include <psapi.h>
12#else
6#include <Psapi.h> 13#include <Psapi.h>
14#endif
15
16#else // Z7_OLD_WIN_SDK
17
18typedef struct _MODULEINFO {
19 LPVOID lpBaseOfDll;
20 DWORD SizeOfImage;
21 LPVOID EntryPoint;
22} MODULEINFO, *LPMODULEINFO;
23
24typedef struct _PROCESS_MEMORY_COUNTERS {
25 DWORD cb;
26 DWORD PageFaultCount;
27 SIZE_T PeakWorkingSetSize;
28 SIZE_T WorkingSetSize;
29 SIZE_T QuotaPeakPagedPoolUsage;
30 SIZE_T QuotaPagedPoolUsage;
31 SIZE_T QuotaPeakNonPagedPoolUsage;
32 SIZE_T QuotaNonPagedPoolUsage;
33 SIZE_T PagefileUsage;
34 SIZE_T PeakPagefileUsage;
35} PROCESS_MEMORY_COUNTERS;
36typedef PROCESS_MEMORY_COUNTERS *PPROCESS_MEMORY_COUNTERS;
37
38#endif // Z7_OLD_WIN_SDK
7 39
8#include "../Common/MyString.h" 40#include "../Common/MyString.h"
9 41
@@ -18,7 +50,7 @@ public:
18 bool Open(DWORD desiredAccess, bool inheritHandle, DWORD processId) 50 bool Open(DWORD desiredAccess, bool inheritHandle, DWORD processId)
19 { 51 {
20 _handle = ::OpenProcess(desiredAccess, inheritHandle, processId); 52 _handle = ::OpenProcess(desiredAccess, inheritHandle, processId);
21 return (_handle != 0); 53 return (_handle != NULL);
22 } 54 }
23 55
24 #ifndef UNDER_CE 56 #ifndef UNDER_CE
@@ -43,9 +75,14 @@ public:
43 { return BOOLToBool(::ReadProcessMemory(_handle, baseAddress, buffer, size, numberOfBytesRead)); } 75 { return BOOLToBool(::ReadProcessMemory(_handle, baseAddress, buffer, size, numberOfBytesRead)); }
44 76
45 bool WriteMemory(LPVOID baseAddress, LPCVOID buffer, SIZE_T size, SIZE_T* numberOfBytesWritten) 77 bool WriteMemory(LPVOID baseAddress, LPCVOID buffer, SIZE_T size, SIZE_T* numberOfBytesWritten)
46 { return BOOLToBool(::WriteProcessMemory(_handle, baseAddress, buffer, size, numberOfBytesWritten)); } 78 { return BOOLToBool(::WriteProcessMemory(_handle, baseAddress,
47 79 #ifdef Z7_OLD_WIN_SDK
48 bool FlushInstructionCache(LPCVOID baseAddress = 0, SIZE_T size = 0) 80 (LPVOID)
81 #endif
82 buffer,
83 size, numberOfBytesWritten)); }
84
85 bool FlushInstructionCache(LPCVOID baseAddress = NULL, SIZE_T size = 0)
49 { return BOOLToBool(::FlushInstructionCache(_handle, baseAddress, size)); } 86 { return BOOLToBool(::FlushInstructionCache(_handle, baseAddress, size)); }
50 87
51 LPVOID VirtualAlloc(LPVOID address, SIZE_T size, DWORD allocationType, DWORD protect) 88 LPVOID VirtualAlloc(LPVOID address, SIZE_T size, DWORD allocationType, DWORD protect)
@@ -56,17 +93,17 @@ public:
56 93
57 // Process Status API (PSAPI) 94 // Process Status API (PSAPI)
58 95
96 /*
59 bool EmptyWorkingSet() 97 bool EmptyWorkingSet()
60 { return BOOLToBool(::EmptyWorkingSet(_handle)); } 98 { return BOOLToBool(::EmptyWorkingSet(_handle)); }
61 bool EnumModules(HMODULE *hModules, DWORD arraySizeInBytes, LPDWORD receivedBytes) 99 bool EnumModules(HMODULE *hModules, DWORD arraySizeInBytes, LPDWORD receivedBytes)
62 { return BOOLToBool(::EnumProcessModules(_handle, hModules, arraySizeInBytes, receivedBytes)); } 100 { return BOOLToBool(::EnumProcessModules(_handle, hModules, arraySizeInBytes, receivedBytes)); }
63
64 DWORD MyGetModuleBaseName(HMODULE hModule, LPTSTR baseName, DWORD size) 101 DWORD MyGetModuleBaseName(HMODULE hModule, LPTSTR baseName, DWORD size)
65 { return ::GetModuleBaseName(_handle, hModule, baseName, size); } 102 { return ::GetModuleBaseName(_handle, hModule, baseName, size); }
66 bool MyGetModuleBaseName(HMODULE hModule, CSysString &name) 103 bool MyGetModuleBaseName(HMODULE hModule, CSysString &name)
67 { 104 {
68 const unsigned len = MAX_PATH + 100; 105 const unsigned len = MAX_PATH + 100;
69 DWORD resultLen = MyGetModuleBaseName(hModule, name.GetBuf(len), len); 106 const DWORD resultLen = MyGetModuleBaseName(hModule, name.GetBuf(len), len);
70 name.ReleaseBuf_CalcLen(len); 107 name.ReleaseBuf_CalcLen(len);
71 return (resultLen != 0); 108 return (resultLen != 0);
72 } 109 }
@@ -76,7 +113,7 @@ public:
76 bool MyGetModuleFileNameEx(HMODULE hModule, CSysString &name) 113 bool MyGetModuleFileNameEx(HMODULE hModule, CSysString &name)
77 { 114 {
78 const unsigned len = MAX_PATH + 100; 115 const unsigned len = MAX_PATH + 100;
79 DWORD resultLen = MyGetModuleFileNameEx(hModule, name.GetBuf(len), len); 116 const DWORD resultLen = MyGetModuleFileNameEx(hModule, name.GetBuf(len), len);
80 name.ReleaseBuf_CalcLen(len); 117 name.ReleaseBuf_CalcLen(len);
81 return (resultLen != 0); 118 return (resultLen != 0);
82 } 119 }
@@ -85,6 +122,7 @@ public:
85 { return BOOLToBool(::GetModuleInformation(_handle, hModule, moduleInfo, sizeof(MODULEINFO))); } 122 { return BOOLToBool(::GetModuleInformation(_handle, hModule, moduleInfo, sizeof(MODULEINFO))); }
86 bool GetMemoryInfo(PPROCESS_MEMORY_COUNTERS memCounters) 123 bool GetMemoryInfo(PPROCESS_MEMORY_COUNTERS memCounters)
87 { return BOOLToBool(::GetProcessMemoryInfo(_handle, memCounters, sizeof(PROCESS_MEMORY_COUNTERS))); } 124 { return BOOLToBool(::GetProcessMemoryInfo(_handle, memCounters, sizeof(PROCESS_MEMORY_COUNTERS))); }
125 */
88 126
89 #endif 127 #endif
90 128
diff --git a/CPP/Windows/PropVariant.cpp b/CPP/Windows/PropVariant.cpp
index 2b17950..457b1dc 100644
--- a/CPP/Windows/PropVariant.cpp
+++ b/CPP/Windows/PropVariant.cpp
@@ -197,17 +197,17 @@ BSTR CPropVariant::AllocBstr(unsigned numChars)
197 197
198void CPropVariant::Set_Int32(Int32 value) throw() 198void CPropVariant::Set_Int32(Int32 value) throw()
199{ 199{
200 SET_PROP_id_dest(VT_I4, lVal); 200 SET_PROP_id_dest(VT_I4, lVal)
201} 201}
202 202
203void CPropVariant::Set_Int64(Int64 value) throw() 203void CPropVariant::Set_Int64(Int64 value) throw()
204{ 204{
205 SET_PROP_id_dest(VT_I8, hVal.QuadPart); 205 SET_PROP_id_dest(VT_I8, hVal.QuadPart)
206} 206}
207 207
208#define SET_PROP_FUNC(type, id, dest) \ 208#define SET_PROP_FUNC(type, id, dest) \
209 CPropVariant& CPropVariant::operator=(type value) throw() \ 209 CPropVariant& CPropVariant::operator=(type value) throw() \
210 { SET_PROP_id_dest(id, dest); return *this; } 210 { SET_PROP_id_dest(id, dest) return *this; }
211 211
212SET_PROP_FUNC(Byte, VT_UI1, bVal) 212SET_PROP_FUNC(Byte, VT_UI1, bVal)
213// SET_PROP_FUNC(Int16, VT_I2, iVal) 213// SET_PROP_FUNC(Int16, VT_I2, iVal)
@@ -245,7 +245,7 @@ SET_PROP_FUNC(const FILETIME &, VT_FILETIME, filetime)
245 we call system functions for VT_BSTR and for unknown typed 245 we call system functions for VT_BSTR and for unknown typed
246*/ 246*/
247 247
248CPropVariant::~CPropVariant() 248CPropVariant::~CPropVariant() throw()
249{ 249{
250 switch ((unsigned)vt) 250 switch ((unsigned)vt)
251 { 251 {
diff --git a/CPP/Windows/PropVariant.h b/CPP/Windows/PropVariant.h
index 171402f..f358fde 100644
--- a/CPP/Windows/PropVariant.h
+++ b/CPP/Windows/PropVariant.h
@@ -1,7 +1,7 @@
1// Windows/PropVariant.h 1// Windows/PropVariant.h
2 2
3#ifndef __WINDOWS_PROP_VARIANT_H 3#ifndef ZIP7_INC_WINDOWS_PROP_VARIANT_H
4#define __WINDOWS_PROP_VARIANT_H 4#define ZIP7_INC_WINDOWS_PROP_VARIANT_H
5 5
6#include "../Common/MyTypes.h" 6#include "../Common/MyTypes.h"
7#include "../Common/MyWindows.h" 7#include "../Common/MyWindows.h"
@@ -64,7 +64,7 @@ public:
64 // wReserved2 = 0; 64 // wReserved2 = 0;
65 // wReserved3 = 0; 65 // wReserved3 = 0;
66 // uhVal.QuadPart = 0; 66 // uhVal.QuadPart = 0;
67 bstrVal = 0; 67 bstrVal = NULL;
68 } 68 }
69 69
70 70
@@ -104,13 +104,13 @@ public:
104 const unsigned ns100 = wReserved2; 104 const unsigned ns100 = wReserved2;
105 if (prec == 0 105 if (prec == 0
106 && prec <= k_PropVar_TimePrec_1ns 106 && prec <= k_PropVar_TimePrec_1ns
107 && ns100 < 100 107 && ns100 < 100
108 && wReserved3 == 0) 108 && wReserved3 == 0)
109 return ns100; 109 return ns100;
110 return 0; 110 return 0;
111 } 111 }
112 112
113 ~CPropVariant(); 113 ~CPropVariant() throw();
114 CPropVariant(const PROPVARIANT &varSrc); 114 CPropVariant(const PROPVARIANT &varSrc);
115 CPropVariant(const CPropVariant &varSrc); 115 CPropVariant(const CPropVariant &varSrc);
116 CPropVariant(BSTR bstrSrc); 116 CPropVariant(BSTR bstrSrc);
diff --git a/CPP/Windows/PropVariantConv.cpp b/CPP/Windows/PropVariantConv.cpp
index 3c9bbd1..5fb96a7 100644
--- a/CPP/Windows/PropVariantConv.cpp
+++ b/CPP/Windows/PropVariantConv.cpp
@@ -36,17 +36,17 @@ bool ConvertUtcFileTimeToString2(const FILETIME &utc, unsigned ns100, char *s, i
36 s[0] = (char)('0' + val / 10); 36 s[0] = (char)('0' + val / 10);
37 s += 4; 37 s += 4;
38 } 38 }
39 UINT_TO_STR_2('-', st.wMonth); 39 UINT_TO_STR_2('-', st.wMonth)
40 UINT_TO_STR_2('-', st.wDay); 40 UINT_TO_STR_2('-', st.wDay)
41 41
42 if (level > kTimestampPrintLevel_DAY) 42 if (level > kTimestampPrintLevel_DAY)
43 { 43 {
44 UINT_TO_STR_2(' ', st.wHour); 44 UINT_TO_STR_2(' ', st.wHour)
45 UINT_TO_STR_2(':', st.wMinute); 45 UINT_TO_STR_2(':', st.wMinute)
46 46
47 if (level >= kTimestampPrintLevel_SEC) 47 if (level >= kTimestampPrintLevel_SEC)
48 { 48 {
49 UINT_TO_STR_2(':', st.wSecond); 49 UINT_TO_STR_2(':', st.wSecond)
50 50
51 if (level > kTimestampPrintLevel_SEC) 51 if (level > kTimestampPrintLevel_SEC)
52 { 52 {
diff --git a/CPP/Windows/PropVariantConv.h b/CPP/Windows/PropVariantConv.h
index 6067784..ec5223b 100644
--- a/CPP/Windows/PropVariantConv.h
+++ b/CPP/Windows/PropVariantConv.h
@@ -1,7 +1,7 @@
1// Windows/PropVariantConv.h 1// Windows/PropVariantConv.h
2 2
3#ifndef __PROP_VARIANT_CONV_H 3#ifndef ZIP7_INC_PROP_VARIANT_CONV_H
4#define __PROP_VARIANT_CONV_H 4#define ZIP7_INC_PROP_VARIANT_CONV_H
5 5
6#include "../Common/MyTypes.h" 6#include "../Common/MyTypes.h"
7 7
diff --git a/CPP/Windows/PropVariantUtils.h b/CPP/Windows/PropVariantUtils.h
index 3dd8295..78adb50 100644
--- a/CPP/Windows/PropVariantUtils.h
+++ b/CPP/Windows/PropVariantUtils.h
@@ -1,7 +1,7 @@
1// Windows/PropVariantUtils.h 1// Windows/PropVariantUtils.h
2 2
3#ifndef __PROP_VARIANT_UTILS_H 3#ifndef ZIP7_INC_PROP_VARIANT_UTILS_H
4#define __PROP_VARIANT_UTILS_H 4#define ZIP7_INC_PROP_VARIANT_UTILS_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7 7
@@ -24,11 +24,11 @@ void FlagsToProp(const CUInt32PCharPair *pairs, unsigned num, UInt32 flags, NWin
24AString TypeToString(const char * const table[], unsigned num, UInt32 value); 24AString TypeToString(const char * const table[], unsigned num, UInt32 value);
25void TypeToProp(const char * const table[], unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop); 25void TypeToProp(const char * const table[], unsigned num, UInt32 value, NWindows::NCOM::CPropVariant &prop);
26 26
27#define PAIR_TO_PROP(pairs, value, prop) PairToProp(pairs, ARRAY_SIZE(pairs), value, prop) 27#define PAIR_TO_PROP(pairs, value, prop) PairToProp(pairs, Z7_ARRAY_SIZE(pairs), value, prop)
28#define FLAGS_TO_PROP(pairs, value, prop) FlagsToProp(pairs, ARRAY_SIZE(pairs), value, prop) 28#define FLAGS_TO_PROP(pairs, value, prop) FlagsToProp(pairs, Z7_ARRAY_SIZE(pairs), value, prop)
29#define TYPE_TO_PROP(table, value, prop) TypeToProp(table, ARRAY_SIZE(table), value, prop) 29#define TYPE_TO_PROP(table, value, prop) TypeToProp(table, Z7_ARRAY_SIZE(table), value, prop)
30 30
31void Flags64ToProp(const CUInt32PCharPair *pairs, unsigned num, UInt64 flags, NWindows::NCOM::CPropVariant &prop); 31void Flags64ToProp(const CUInt32PCharPair *pairs, unsigned num, UInt64 flags, NWindows::NCOM::CPropVariant &prop);
32#define FLAGS64_TO_PROP(pairs, value, prop) Flags64ToProp(pairs, ARRAY_SIZE(pairs), value, prop) 32#define FLAGS64_TO_PROP(pairs, value, prop) Flags64ToProp(pairs, Z7_ARRAY_SIZE(pairs), value, prop)
33 33
34#endif 34#endif
diff --git a/CPP/Windows/Registry.h b/CPP/Windows/Registry.h
index ca79dfe..0d3b4fc 100644
--- a/CPP/Windows/Registry.h
+++ b/CPP/Windows/Registry.h
@@ -1,7 +1,7 @@
1// Windows/Registry.h 1// Windows/Registry.h
2 2
3#ifndef __WINDOWS_REGISTRY_H 3#ifndef ZIP7_INC_WINDOWS_REGISTRY_H
4#define __WINDOWS_REGISTRY_H 4#define ZIP7_INC_WINDOWS_REGISTRY_H
5 5
6#include "../Common/MyBuffer.h" 6#include "../Common/MyBuffer.h"
7#include "../Common/MyString.h" 7#include "../Common/MyString.h"
diff --git a/CPP/Windows/ResourceString.h b/CPP/Windows/ResourceString.h
index f0bdabf..773307b 100644
--- a/CPP/Windows/ResourceString.h
+++ b/CPP/Windows/ResourceString.h
@@ -1,9 +1,10 @@
1// Windows/ResourceString.h 1// Windows/ResourceString.h
2 2
3#ifndef __WINDOWS_RESOURCE_STRING_H 3#ifndef ZIP7_INC_WINDOWS_RESOURCE_STRING_H
4#define __WINDOWS_RESOURCE_STRING_H 4#define ZIP7_INC_WINDOWS_RESOURCE_STRING_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7#include "../Common/MyWindows.h"
7 8
8namespace NWindows { 9namespace NWindows {
9 10
diff --git a/CPP/Windows/SecurityUtils.cpp b/CPP/Windows/SecurityUtils.cpp
index ede83fa..d4282d0 100644
--- a/CPP/Windows/SecurityUtils.cpp
+++ b/CPP/Windows/SecurityUtils.cpp
@@ -4,9 +4,6 @@
4 4
5#include "SecurityUtils.h" 5#include "SecurityUtils.h"
6 6
7#define MY_CAST_FUNC (void(*)())
8// #define MY_CAST_FUNC
9
10namespace NWindows { 7namespace NWindows {
11namespace NSecurity { 8namespace NSecurity {
12 9
@@ -35,7 +32,7 @@ bool MyLookupAccountSid(LPCTSTR systemName, PSID sid,
35 32
36static void SetLsaString(LPWSTR src, PLSA_UNICODE_STRING dest) 33static void SetLsaString(LPWSTR src, PLSA_UNICODE_STRING dest)
37{ 34{
38 size_t len = (size_t)wcslen(src); 35 const size_t len = (size_t)wcslen(src);
39 dest->Length = (USHORT)(len * sizeof(WCHAR)); 36 dest->Length = (USHORT)(len * sizeof(WCHAR));
40 dest->MaximumLength = (USHORT)((len + 1) * sizeof(WCHAR)); 37 dest->MaximumLength = (USHORT)((len + 1) * sizeof(WCHAR));
41 dest->Buffer = src; 38 dest->Buffer = src;
@@ -72,13 +69,14 @@ typedef BOOL (WINAPI * Func_LookupAccountNameW)(
72static PSID GetSid(LPWSTR accountName) 69static PSID GetSid(LPWSTR accountName)
73{ 70{
74 #ifndef _UNICODE 71 #ifndef _UNICODE
75 HMODULE hModule = GetModuleHandle(TEXT("Advapi32.dll")); 72 const HMODULE hModule = GetModuleHandle(TEXT("advapi32.dll"));
76 if (hModule == NULL) 73 if (!hModule)
77 return NULL; 74 return NULL;
78 Func_LookupAccountNameW lookupAccountNameW = (Func_LookupAccountNameW) 75 const
79 MY_CAST_FUNC 76 Func_LookupAccountNameW lookupAccountNameW = Z7_GET_PROC_ADDRESS(
80 GetProcAddress(hModule, "LookupAccountNameW"); 77 Func_LookupAccountNameW, hModule,
81 if (lookupAccountNameW == NULL) 78 "LookupAccountNameW");
79 if (!lookupAccountNameW)
82 return NULL; 80 return NULL;
83 #endif 81 #endif
84 82
@@ -88,21 +86,21 @@ static PSID GetSid(LPWSTR accountName)
88 #ifdef _UNICODE 86 #ifdef _UNICODE
89 ::LookupAccountNameW 87 ::LookupAccountNameW
90 #else 88 #else
91 lookupAccountNameW 89 lookupAccountNameW
92 #endif 90 #endif
93 (NULL, accountName, NULL, &sidLen, NULL, &domainLen, &sidNameUse)) 91 (NULL, accountName, NULL, &sidLen, NULL, &domainLen, &sidNameUse))
94 { 92 {
95 if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) 93 if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
96 { 94 {
97 PSID pSid = ::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sidLen); 95 const PSID pSid = ::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sidLen);
98 LPWSTR domainName = (LPWSTR)::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (domainLen + 1) * sizeof(WCHAR)); 96 LPWSTR domainName = (LPWSTR)::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (domainLen + 1) * sizeof(WCHAR));
99 BOOL res = 97 const BOOL res =
100 #ifdef _UNICODE 98 #ifdef _UNICODE
101 ::LookupAccountNameW 99 ::LookupAccountNameW
102 #else 100 #else
103 lookupAccountNameW 101 lookupAccountNameW
104 #endif 102 #endif
105 (NULL, accountName, pSid, &sidLen, domainName, &domainLen, &sidNameUse); 103 (NULL, accountName, pSid, &sidLen, domainName, &domainLen, &sidNameUse);
106 ::HeapFree(GetProcessHeap(), 0, domainName); 104 ::HeapFree(GetProcessHeap(), 0, domainName);
107 if (res) 105 if (res)
108 return pSid; 106 return pSid;
@@ -111,7 +109,7 @@ static PSID GetSid(LPWSTR accountName)
111 return NULL; 109 return NULL;
112} 110}
113 111
114#define MY__SE_LOCK_MEMORY_NAME L"SeLockMemoryPrivilege" 112#define Z7_WIN_SE_LOCK_MEMORY_NAME L"SeLockMemoryPrivilege"
115 113
116bool AddLockMemoryPrivilege() 114bool AddLockMemoryPrivilege()
117{ 115{
@@ -131,13 +129,13 @@ bool AddLockMemoryPrivilege()
131 != 0) 129 != 0)
132 return false; 130 return false;
133 LSA_UNICODE_STRING userRights; 131 LSA_UNICODE_STRING userRights;
134 wchar_t s[128] = MY__SE_LOCK_MEMORY_NAME; 132 wchar_t s[128] = Z7_WIN_SE_LOCK_MEMORY_NAME;
135 SetLsaString(s, &userRights); 133 SetLsaString(s, &userRights);
136 WCHAR userName[256 + 2]; 134 WCHAR userName[256 + 2];
137 DWORD size = 256; 135 DWORD size = 256;
138 if (!GetUserNameW(userName, &size)) 136 if (!GetUserNameW(userName, &size))
139 return false; 137 return false;
140 PSID psid = GetSid(userName); 138 const PSID psid = GetSid(userName);
141 if (psid == NULL) 139 if (psid == NULL)
142 return false; 140 return false;
143 bool res = false; 141 bool res = false;
@@ -176,7 +174,7 @@ bool AddLockMemoryPrivilege()
176 res = true; 174 res = true;
177 } 175 }
178 */ 176 */
179 NTSTATUS status = policy.AddAccountRights(psid, &userRights); 177 const NTSTATUS status = policy.AddAccountRights(psid, &userRights);
180 if (status == 0) 178 if (status == 0)
181 res = true; 179 res = true;
182 // ULONG res = LsaNtStatusToWinError(status); 180 // ULONG res = LsaNtStatusToWinError(status);
diff --git a/CPP/Windows/SecurityUtils.h b/CPP/Windows/SecurityUtils.h
index c0d7b12..4ef3939 100644
--- a/CPP/Windows/SecurityUtils.h
+++ b/CPP/Windows/SecurityUtils.h
@@ -1,7 +1,7 @@
1// Windows/SecurityUtils.h 1// Windows/SecurityUtils.h
2 2
3#ifndef __WINDOWS_SECURITY_UTILS_H 3#ifndef ZIP7_INC_WINDOWS_SECURITY_UTILS_H
4#define __WINDOWS_SECURITY_UTILS_H 4#define ZIP7_INC_WINDOWS_SECURITY_UTILS_H
5 5
6#include <NTSecAPI.h> 6#include <NTSecAPI.h>
7 7
@@ -20,7 +20,7 @@ typedef NTSTATUS (NTAPI *Func_LsaAddAccountRights)(LSA_HANDLE PolicyHandle,
20 20
21#define POLICY_FUNC_CALL(fff, str) \ 21#define POLICY_FUNC_CALL(fff, str) \
22 if (hModule == NULL) return MY_STATUS_NOT_IMPLEMENTED; \ 22 if (hModule == NULL) return MY_STATUS_NOT_IMPLEMENTED; \
23 Func_ ## fff v = (Func_ ## fff) (void(*)()) GetProcAddress(hModule, str); \ 23 const Func_ ## fff v = Z7_GET_PROC_ADDRESS(Func_ ## fff, hModule, str); \
24 if (!v) return MY_STATUS_NOT_IMPLEMENTED; \ 24 if (!v) return MY_STATUS_NOT_IMPLEMENTED; \
25 const NTSTATUS res = v 25 const NTSTATUS res = v
26 26
@@ -39,7 +39,7 @@ class CAccessToken
39{ 39{
40 HANDLE _handle; 40 HANDLE _handle;
41public: 41public:
42 CAccessToken(): _handle(NULL) {}; 42 CAccessToken(): _handle(NULL) {}
43 ~CAccessToken() { Close(); } 43 ~CAccessToken() { Close(); }
44 bool Close() 44 bool Close()
45 { 45 {
@@ -93,9 +93,9 @@ public:
93 CPolicy(): _handle(NULL) 93 CPolicy(): _handle(NULL)
94 { 94 {
95 #ifndef _UNICODE 95 #ifndef _UNICODE
96 hModule = GetModuleHandle(TEXT("Advapi32.dll")); 96 hModule = GetModuleHandle(TEXT("advapi32.dll"));
97 #endif 97 #endif
98 }; 98 }
99 ~CPolicy() { Close(); } 99 ~CPolicy() { Close(); }
100 100
101 NTSTATUS Open(PLSA_UNICODE_STRING systemName, PLSA_OBJECT_ATTRIBUTES objectAttributes, 101 NTSTATUS Open(PLSA_UNICODE_STRING systemName, PLSA_OBJECT_ATTRIBUTES objectAttributes,
diff --git a/CPP/Windows/Shell.cpp b/CPP/Windows/Shell.cpp
index 071833c..b2a3489 100644
--- a/CPP/Windows/Shell.cpp
+++ b/CPP/Windows/Shell.cpp
@@ -2,23 +2,50 @@
2 2
3#include "StdAfx.h" 3#include "StdAfx.h"
4 4
5/*
6#include <stdio.h>
7#include <string.h>
8*/
9
10#include "../Common/MyCom.h" 5#include "../Common/MyCom.h"
11#ifndef _UNICODE
12#include "../Common/StringConvert.h" 6#include "../Common/StringConvert.h"
13#endif
14 7
15#include "COM.h" 8#include "COM.h"
9#include "FileName.h"
10#include "MemoryGlobal.h"
16#include "Shell.h" 11#include "Shell.h"
17 12
18#ifndef _UNICODE 13#ifndef _UNICODE
19extern bool g_IsNT; 14extern bool g_IsNT;
20#endif 15#endif
21 16
17// MSVC6 and old SDK don't support this function:
18// #define LWSTDAPI EXTERN_C DECLSPEC_IMPORT HRESULT STDAPICALLTYPE
19// LWSTDAPI StrRetToStrW(STRRET *pstr, LPCITEMIDLIST pidl, LPWSTR *ppsz);
20
21// #define SHOW_DEBUG_SHELL
22
23#ifdef SHOW_DEBUG_SHELL
24
25#include "../Common/IntToString.h"
26
27static void Print_Number(UInt32 number, const char *s)
28{
29 AString s2;
30 s2.Add_UInt32(number);
31 s2.Add_Space();
32 s2 += s;
33 OutputDebugStringA(s2);
34}
35
36#define ODS(sz) { OutputDebugStringA(sz); }
37#define ODS_U(s) { OutputDebugStringW(s); }
38#define ODS_(op) { op; }
39
40#else
41
42#define ODS(sz)
43#define ODS_U(s)
44#define ODS_(op)
45
46#endif
47
48
22namespace NWindows { 49namespace NWindows {
23namespace NShell { 50namespace NShell {
24 51
@@ -28,12 +55,24 @@ namespace NShell {
28 55
29void CItemIDList::Free() 56void CItemIDList::Free()
30{ 57{
31 if (m_Object == NULL) 58 if (!m_Object)
32 return; 59 return;
60 /* DOCs:
61 SHGetMalloc was introduced in Windows 95 and Microsoft Windows NT 4.0,
62 but as of Windows 2000 it is no longer necessary.
63 In its place, programs can call the equivalent (and easier to use) CoTaskMemAlloc and CoTaskMemFree.
64 Description from oldnewthings:
65 shell functions could work without COM (if OLE32.DLL is not loaded),
66 but now if OLE32.DLL is loaded, then shell functions and com functions do same things.
67 22.02: so we use OLE32.DLL function to free memory:
68 */
69 /*
33 CMyComPtr<IMalloc> shellMalloc; 70 CMyComPtr<IMalloc> shellMalloc;
34 if (::SHGetMalloc(&shellMalloc) != NOERROR) 71 if (::SHGetMalloc(&shellMalloc) != NOERROR)
35 throw 41099; 72 throw 41099;
36 shellMalloc->Free(m_Object); 73 shellMalloc->Free(m_Object);
74 */
75 CoTaskMemFree(m_Object);
37 m_Object = NULL; 76 m_Object = NULL;
38} 77}
39 78
@@ -70,9 +109,354 @@ CItemIDList& CItemIDList::operator=(const CItemIDList &object)
70} 109}
71*/ 110*/
72 111
112
113static HRESULT ReadUnicodeStrings(const wchar_t *p, size_t size, UStringVector &names)
114{
115 names.Clear();
116 const wchar_t *lim = p + size;
117 UString s;
118 /*
119 if (size == 0 || p[size - 1] != 0)
120 return E_INVALIDARG;
121 if (size == 1)
122 return S_OK;
123 if (p[size - 2] != 0)
124 return E_INVALIDARG;
125 */
126 for (;;)
127 {
128 const wchar_t *start = p;
129 for (;;)
130 {
131 if (p == lim) return E_INVALIDARG; // S_FALSE
132 if (*p++ == 0)
133 break;
134 }
135 const size_t num = (size_t)(p - start);
136 if (num == 1)
137 {
138 if (p != lim) return E_INVALIDARG; // S_FALSE
139 return S_OK;
140 }
141 s.SetFrom(start, (unsigned)(num - 1));
142 ODS_U(s)
143 names.Add(s);
144 // names.ReserveOnePosition();
145 // names.AddInReserved_Ptr_of_new(new UString((unsigned)num - 1, start));
146 }
147}
148
149
150static HRESULT ReadAnsiStrings(const char *p, size_t size, UStringVector &names)
151{
152 names.Clear();
153 AString name;
154 for (; size != 0; size--)
155 {
156 const char c = *p++;
157 if (c == 0)
158 {
159 if (name.IsEmpty())
160 return S_OK;
161 names.Add(GetUnicodeString(name));
162 name.Empty();
163 }
164 else
165 name += c;
166 }
167 return E_INVALIDARG;
168}
169
170
171#define INIT_FORMATETC_HGLOBAL(type) { (type), NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }
172
173static HRESULT DataObject_GetData_HGLOBAL(IDataObject *dataObject, CLIPFORMAT cf, NCOM::CStgMedium &medium)
174{
175 FORMATETC etc = INIT_FORMATETC_HGLOBAL(cf);
176 RINOK(dataObject->GetData(&etc, &medium))
177 if (medium.tymed != TYMED_HGLOBAL)
178 return E_INVALIDARG;
179 return S_OK;
180}
181
182static HRESULT DataObject_GetData_HDROP_Names(IDataObject *dataObject, UStringVector &names)
183{
184 names.Clear();
185 NCOM::CStgMedium medium;
186
187 /* Win10 : if (dataObject) is from IContextMenu::Initialize() and
188 if (len_of_path >= MAX_PATH (260) for some file in data object)
189 {
190 GetData() returns HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER)
191 "The data area passed to a system call is too small",
192 Is there a way to fix this code for long paths?
193 } */
194
195 RINOK(DataObject_GetData_HGLOBAL(dataObject, CF_HDROP, medium))
196 const size_t blockSize = GlobalSize(medium.hGlobal);
197 if (blockSize < sizeof(DROPFILES))
198 return E_INVALIDARG;
199 NMemory::CGlobalLock dropLock(medium.hGlobal);
200 const DROPFILES *dropFiles = (const DROPFILES *)dropLock.GetPointer();
201 if (!dropFiles)
202 return E_INVALIDARG;
203 if (blockSize < dropFiles->pFiles
204 || dropFiles->pFiles < sizeof(DROPFILES)
205 // || dropFiles->pFiles != sizeof(DROPFILES)
206 )
207 return E_INVALIDARG;
208 const size_t size = blockSize - dropFiles->pFiles;
209 const void *namesData = (const Byte *)(const void *)dropFiles + dropFiles->pFiles;
210 HRESULT hres;
211 if (dropFiles->fWide)
212 {
213 if (size % sizeof(wchar_t) != 0)
214 return E_INVALIDARG;
215 hres = ReadUnicodeStrings((const wchar_t *)namesData, size / sizeof(wchar_t), names);
216 }
217 else
218 hres = ReadAnsiStrings((const char *)namesData, size, names);
219
220 ODS_(Print_Number(names.Size(), "DataObject_GetData_HDROP_Names"))
221 return hres;
222}
223
224
225
226// CF_IDLIST:
227#define MYWIN_CFSTR_SHELLIDLIST TEXT("Shell IDList Array")
228
229typedef struct
230{
231 UINT cidl;
232 UINT aoffset[1];
233} MYWIN_CIDA;
234/*
235 cidl : number of PIDLs that are being transferred, not including the parent folder.
236 aoffset : An array of offsets, relative to the beginning of this structure.
237 aoffset[0] - fully qualified PIDL of a parent folder.
238 If this PIDL is empty, the parent folder is the desktop.
239 aoffset[1] ... aoffset[cidl] : offset to one of the PIDLs to be transferred.
240 All of these PIDLs are relative to the PIDL of the parent folder.
241*/
242
243static HRESULT DataObject_GetData_IDLIST(IDataObject *dataObject, UStringVector &names)
244{
245 names.Clear();
246 NCOM::CStgMedium medium;
247 RINOK(DataObject_GetData_HGLOBAL(dataObject, (CLIPFORMAT)
248 RegisterClipboardFormat(MYWIN_CFSTR_SHELLIDLIST), medium))
249 const size_t blockSize = GlobalSize(medium.hGlobal);
250 if (blockSize < sizeof(MYWIN_CIDA) || blockSize >= (UInt32)((UInt32)0 - 1))
251 return E_INVALIDARG;
252 NMemory::CGlobalLock dropLock(medium.hGlobal);
253 const MYWIN_CIDA *cida = (const MYWIN_CIDA *)dropLock.GetPointer();
254 if (!cida)
255 return E_INVALIDARG;
256 if (cida->cidl == 0)
257 {
258 // is it posssible to have no selected items?
259 // it's unexpected case.
260 return E_INVALIDARG;
261 }
262 if (cida->cidl >= (blockSize - (UInt32)sizeof(MYWIN_CIDA)) / sizeof(UINT))
263 return E_INVALIDARG;
264 const UInt32 start = cida->cidl * (UInt32)sizeof(UINT) + (UInt32)sizeof(MYWIN_CIDA);
265
266 STRRET strret;
267 CMyComPtr<IShellFolder> parentFolder;
268 {
269 const UINT offset = cida->aoffset[0];
270 if (offset < start || offset >= blockSize
271 // || offset != start
272 )
273 return E_INVALIDARG;
274
275 CMyComPtr<IShellFolder> desktopFolder;
276 RINOK(::SHGetDesktopFolder(&desktopFolder))
277 if (!desktopFolder)
278 return E_FAIL;
279
280 LPCITEMIDLIST const lpcItem = (LPCITEMIDLIST)(const void *)((const Byte *)cida + offset);
281
282 #ifdef SHOW_DEBUG_SHELL
283 {
284 const HRESULT res = desktopFolder->GetDisplayNameOf(
285 lpcItem, SHGDN_FORPARSING, &strret);
286 if (res == S_OK && strret.uType == STRRET_WSTR)
287 {
288 ODS_U(strret.pOleStr)
289 /* if lpcItem is empty, the path will be
290 "C:\Users\user_name\Desktop"
291 if lpcItem is "My Computer" folder, the path will be
292 "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" */
293 CoTaskMemFree(strret.pOleStr);
294 }
295 }
296 #endif
297
298 RINOK(desktopFolder->BindToObject(lpcItem,
299 NULL, IID_IShellFolder, (void **)&parentFolder))
300 if (!parentFolder)
301 return E_FAIL;
302 }
303
304 names.ClearAndReserve(cida->cidl);
305 UString path;
306
307 // for (int y = 0; y < 1; y++) // for debug
308 for (unsigned i = 1; i <= cida->cidl; i++)
309 {
310 const UINT offset = cida->aoffset[i];
311 if (offset < start || offset >= blockSize)
312 return E_INVALIDARG;
313 const void *p = (const Byte *)(const void *)cida + offset;
314 /* ITEMIDLIST of file can contain more than one SHITEMID item.
315 In win10 only SHGDN_FORPARSING returns path that contains
316 all path parts related to parts of ITEMIDLIST.
317 So we can use only SHGDN_FORPARSING here.
318 Don't use (SHGDN_INFOLDER)
319 Don't use (SHGDN_INFOLDER | SHGDN_FORPARSING)
320 */
321 RINOK(parentFolder->GetDisplayNameOf((LPCITEMIDLIST)p, SHGDN_FORPARSING, &strret))
322
323 /*
324 // MSVC6 and old SDK do not support StrRetToStrW().
325 LPWSTR lpstr;
326 RINOK (StrRetToStrW(&strret, NULL, &lpstr))
327 ODS_U(lpstr)
328 path = lpstr;
329 CoTaskMemFree(lpstr);
330 */
331 if (strret.uType != STRRET_WSTR)
332 return E_INVALIDARG;
333 ODS_U(strret.pOleStr)
334 path = strret.pOleStr;
335 // the path could have super path prefix "\\\\?\\"
336 // we can remove super path prefix here, if we don't need that prefix
337 #ifdef Z7_LONG_PATH
338 // we remove super prefix, if we can work without that prefix
339 NFile::NName::If_IsSuperPath_RemoveSuperPrefix(path);
340 #endif
341 names.AddInReserved(path);
342 CoTaskMemFree(strret.pOleStr);
343 }
344
345 ODS_(Print_Number(cida->cidl, "CFSTR_SHELLIDLIST END"))
346 return S_OK;
347}
348
349
350HRESULT DataObject_GetData_HDROP_or_IDLIST_Names(IDataObject *dataObject, UStringVector &paths)
351{
352 ODS("-- DataObject_GetData_HDROP_or_IDLIST_Names START")
353 HRESULT hres = NShell::DataObject_GetData_HDROP_Names(dataObject, paths);
354 // if (hres == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER))
355 if (hres != S_OK)
356 {
357 ODS("-- DataObject_GetData_IDLIST START")
358 // for (int y = 0; y < 10000; y++) // for debug
359 hres = NShell::DataObject_GetData_IDLIST(dataObject, paths);
360 }
361 ODS("-- DataObject_GetData_HDROP_or_IDLIST_Names END")
362 return hres;
363}
364
365
366
367// #if (NTDDI_VERSION >= NTDDI_VISTA)
368typedef struct
369{
370 UINT cItems; // number of items in rgdwFileAttributes array
371 DWORD dwSumFileAttributes; // all of the attributes ORed together
372 DWORD dwProductFileAttributes; // all of the attributes ANDed together
373 DWORD rgdwFileAttributes[1]; // array
374} MYWIN_FILE_ATTRIBUTES_ARRAY;
375
376#define MYWIN_CFSTR_FILE_ATTRIBUTES_ARRAY TEXT("File Attributes Array")
377
378HRESULT DataObject_GetData_FILE_ATTRS(IDataObject *dataObject, CFileAttribs &attribs)
379{
380 attribs.Clear();
381 NCOM::CStgMedium medium;
382 RINOK(DataObject_GetData_HGLOBAL(dataObject, (CLIPFORMAT)
383 RegisterClipboardFormat(MYWIN_CFSTR_FILE_ATTRIBUTES_ARRAY), medium))
384 const size_t blockSize = GlobalSize(medium.hGlobal);
385 if (blockSize < sizeof(MYWIN_FILE_ATTRIBUTES_ARRAY))
386 return E_INVALIDARG;
387 NMemory::CGlobalLock dropLock(medium.hGlobal);
388 const MYWIN_FILE_ATTRIBUTES_ARRAY *faa = (const MYWIN_FILE_ATTRIBUTES_ARRAY *)dropLock.GetPointer();
389 if (!faa)
390 return E_INVALIDARG;
391 const unsigned numFiles = faa->cItems;
392 if (numFiles == 0)
393 {
394 // is it posssible to have empty array here?
395 return E_INVALIDARG;
396 }
397 if ((blockSize - (sizeof(MYWIN_FILE_ATTRIBUTES_ARRAY) - sizeof(DWORD)))
398 / sizeof(DWORD) != numFiles)
399 return E_INVALIDARG;
400 // attribs.Sum = faa->dwSumFileAttributes;
401 // attribs.Product = faa->dwProductFileAttributes;
402 // attribs.Vals.SetFromArray(faa->rgdwFileAttributes, numFiles);
403 // attribs.IsDirVector.ClearAndSetSize(numFiles);
404
405 if ((faa->dwSumFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
406 {
407 /* in win10: if selected items are volumes (c:\, d:\ ..) in My Compter,
408 all items have FILE_ATTRIBUTE_DIRECTORY attribute
409 ntfs volume also have FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM
410 udf volume: FILE_ATTRIBUTE_READONLY
411 dvd-rom device: (-1) : all bits are set
412 */
413 const DWORD *attr = faa->rgdwFileAttributes;
414 // DWORD product = (UInt32)0 - 1, sum = 0;
415 for (unsigned i = 0; i < numFiles; i++)
416 {
417 if (attr[i] & FILE_ATTRIBUTE_DIRECTORY)
418 {
419 // attribs.ThereAreDirs = true;
420 attribs.FirstDirIndex = (int)i;
421 break;
422 }
423 // attribs.IsDirVector[i] = (attr[i] & FILE_ATTRIBUTE_DIRECTORY) != 0;
424 // product &= v;
425 // sum |= v;
426 }
427 // ODS_(Print_Number(product, "Product calc FILE_ATTRIBUTES_ARRAY ==== DataObject_GetData_HDROP_Names"))
428 // ODS_(Print_Number(sum, "Sum calc FILE_ATTRIBUTES_ARRAY ==== DataObject_GetData_HDROP_Names"))
429 }
430 // ODS_(Print_Number(attribs.Product, "Product FILE_ATTRIBUTES_ARRAY ==== DataObject_GetData_HDROP_Names"))
431 // ODS_(Print_Number(attribs.Sum, "Sum FILE_ATTRIBUTES_ARRAY ==== DataObject_GetData_HDROP_Names"))
432 ODS_(Print_Number(numFiles, "FILE_ATTRIBUTES_ARRAY ==== DataObject_GetData_HDROP_Names"))
433 return S_OK;
434}
435
436
73///////////////////////////// 437/////////////////////////////
74// CDrop 438// CDrop
75 439
440/*
441 win10:
442 DragQueryFile() implementation code is not effective because
443 there is no pointer inside DROP internal file list, so
444 DragQueryFile(fileIndex) runs all names in range [0, fileIndex].
445 DragQueryFile(,, buf, bufSize)
446 if (buf == NULL) by spec
447 {
448 returns value is the required size
449 in characters, of the buffer, not including the terminating null character
450 tests show that if (bufSize == 0), then it also returns required size.
451 }
452 if (bufSize != NULL)
453 {
454 returns: the count of the characters copied, not including null character.
455 win10: null character is also copied at position buf[ret_count];
456 }
457*/
458
459/*
76void CDrop::Attach(HDROP object) 460void CDrop::Attach(HDROP object)
77{ 461{
78 Free(); 462 Free();
@@ -92,56 +476,133 @@ UINT CDrop::QueryCountOfFiles()
92 return QueryFile(0xFFFFFFFF, (LPTSTR)NULL, 0); 476 return QueryFile(0xFFFFFFFF, (LPTSTR)NULL, 0);
93} 477}
94 478
95UString CDrop::QueryFileName(UINT fileIndex) 479void CDrop::QueryFileName(UINT fileIndex, UString &fileName)
96{ 480{
97 UString fileName;
98 #ifndef _UNICODE 481 #ifndef _UNICODE
99 if (!g_IsNT) 482 if (!g_IsNT)
100 { 483 {
101 AString fileNameA; 484 AString fileNameA;
102 UINT bufferSize = QueryFile(fileIndex, (LPTSTR)NULL, 0); 485 const UINT len = QueryFile(fileIndex, (LPTSTR)NULL, 0);
103 const unsigned len = bufferSize + 2; 486 const UINT numCopied = QueryFile(fileIndex, fileNameA.GetBuf(len + 2), len + 2);
104 QueryFile(fileIndex, fileNameA.GetBuf(len), bufferSize + 1);
105 fileNameA.ReleaseBuf_CalcLen(len); 487 fileNameA.ReleaseBuf_CalcLen(len);
488 if (numCopied != len)
489 throw 20221223;
106 fileName = GetUnicodeString(fileNameA); 490 fileName = GetUnicodeString(fileNameA);
107 } 491 }
108 else 492 else
109 #endif 493 #endif
110 { 494 {
111 UINT bufferSize = QueryFile(fileIndex, (LPWSTR)NULL, 0); 495 // kReserve must be >= 3 for additional buffer size
112 const unsigned len = bufferSize + 2; 496 // safety and for optimal performance
113 QueryFile(fileIndex, fileName.GetBuf(len), bufferSize + 1); 497 const unsigned kReserve = 3;
498 {
499 unsigned len = 0;
500 wchar_t *buf = fileName.GetBuf_GetMaxAvail(len);
501 if (len >= kReserve)
502 {
503 const UINT numCopied = QueryFile(fileIndex, buf, len);
504 if (numCopied < len - 1)
505 {
506 // (numCopied < len - 1) case means that it have copied full string.
507 fileName.ReleaseBuf_CalcLen(numCopied);
508 return;
509 }
510 }
511 }
512 const UINT len = QueryFile(fileIndex, (LPWSTR)NULL, 0);
513 const UINT numCopied = QueryFile(fileIndex,
514 fileName.GetBuf(len + kReserve), len + kReserve);
114 fileName.ReleaseBuf_CalcLen(len); 515 fileName.ReleaseBuf_CalcLen(len);
516 if (numCopied != len)
517 throw 20221223;
115 } 518 }
116 return fileName;
117} 519}
118 520
521
119void CDrop::QueryFileNames(UStringVector &fileNames) 522void CDrop::QueryFileNames(UStringVector &fileNames)
120{ 523{
121 UINT numFiles = QueryCountOfFiles(); 524 UINT numFiles = QueryCountOfFiles();
122 /* 525
123 char s[100]; 526 Print_Number(numFiles, "\n====== CDrop::QueryFileNames START ===== \n");
124 sprintf(s, "QueryFileNames: %d files", numFiles); 527
125 OutputDebugStringA(s);
126 */
127 fileNames.ClearAndReserve(numFiles); 528 fileNames.ClearAndReserve(numFiles);
529 UString s;
128 for (UINT i = 0; i < numFiles; i++) 530 for (UINT i = 0; i < numFiles; i++)
129 { 531 {
130 const UString s2 = QueryFileName(i); 532 QueryFileName(i, s);
131 if (!s2.IsEmpty()) 533 if (!s.IsEmpty())
132 fileNames.AddInReserved(s2); 534 fileNames.AddInReserved(s);
133 /*
134 OutputDebugStringW(L"file ---");
135 OutputDebugStringW(s2);
136 */
137 } 535 }
536 Print_Number(numFiles, "\n====== CDrop::QueryFileNames END ===== \n");
537}
538*/
539
540
541// #if (NTDDI_VERSION >= NTDDI_VISTA)
542// SHGetPathFromIDListEx returns a win32 file system path for the item in the name space.
543typedef int Z7_WIN_GPFIDL_FLAGS;
544
545extern "C" {
546typedef BOOL (WINAPI * Func_SHGetPathFromIDListW)(LPCITEMIDLIST pidl, LPWSTR pszPath);
547typedef BOOL (WINAPI * Func_SHGetPathFromIDListEx)(LPCITEMIDLIST pidl, PWSTR pszPath, DWORD cchPath, Z7_WIN_GPFIDL_FLAGS uOpts);
138} 548}
139 549
550#ifndef _UNICODE
140 551
141bool GetPathFromIDList(LPCITEMIDLIST itemIDList, CSysString &path) 552bool GetPathFromIDList(LPCITEMIDLIST itemIDList, AString &path)
553{
554 path.Empty();
555 const unsigned len = MAX_PATH + 16;
556 const bool result = BOOLToBool(::SHGetPathFromIDList(itemIDList, path.GetBuf(len)));
557 path.ReleaseBuf_CalcLen(len);
558 return result;
559}
560
561#endif
562
563bool GetPathFromIDList(LPCITEMIDLIST itemIDList, UString &path)
142{ 564{
143 const unsigned len = MAX_PATH * 2; 565 path.Empty();
566 unsigned len = MAX_PATH + 16;
567
568#ifdef _UNICODE
144 bool result = BOOLToBool(::SHGetPathFromIDList(itemIDList, path.GetBuf(len))); 569 bool result = BOOLToBool(::SHGetPathFromIDList(itemIDList, path.GetBuf(len)));
570#else
571 const
572 Func_SHGetPathFromIDListW
573 shGetPathFromIDListW = Z7_GET_PROC_ADDRESS(
574 Func_SHGetPathFromIDListW, ::GetModuleHandleW(L"shell32.dll"),
575 "SHGetPathFromIDListW");
576 if (!shGetPathFromIDListW)
577 return false;
578 bool result = BOOLToBool(shGetPathFromIDListW(itemIDList, path.GetBuf(len)));
579#endif
580
581 if (!result)
582 {
583 ODS("==== GetPathFromIDList() SHGetPathFromIDList() returned false")
584 /* for long path we need SHGetPathFromIDListEx().
585 win10: SHGetPathFromIDListEx() for long path returns path with
586 with super path prefix "\\\\?\\". */
587 const
588 Func_SHGetPathFromIDListEx
589 func_SHGetPathFromIDListEx = Z7_GET_PROC_ADDRESS(
590 Func_SHGetPathFromIDListEx, ::GetModuleHandleW(L"shell32.dll"),
591 "SHGetPathFromIDListEx");
592 if (func_SHGetPathFromIDListEx)
593 {
594 ODS("==== GetPathFromIDList() (SHGetPathFromIDListEx)")
595 do
596 {
597 len *= 4;
598 result = BOOLToBool(func_SHGetPathFromIDListEx(itemIDList, path.GetBuf(len), len, 0));
599 if (result)
600 break;
601 }
602 while (len <= (1 << 16));
603 }
604 }
605
145 path.ReleaseBuf_CalcLen(len); 606 path.ReleaseBuf_CalcLen(len);
146 return result; 607 return result;
147} 608}
@@ -180,11 +641,16 @@ bool BrowseForFolder(HWND /* owner */, LPCTSTR /* title */,
180 641
181#else 642#else
182 643
644/* win10: SHBrowseForFolder() doesn't support long paths,
645 even if long path suppport is enabled in registry and in manifest.
646 and SHBrowseForFolder() doesn't support super path prefix "\\\\?\\". */
647
183bool BrowseForFolder(LPBROWSEINFO browseInfo, CSysString &resultPath) 648bool BrowseForFolder(LPBROWSEINFO browseInfo, CSysString &resultPath)
184{ 649{
650 resultPath.Empty();
185 NWindows::NCOM::CComInitializer comInitializer; 651 NWindows::NCOM::CComInitializer comInitializer;
186 LPITEMIDLIST itemIDList = ::SHBrowseForFolder(browseInfo); 652 LPITEMIDLIST itemIDList = ::SHBrowseForFolder(browseInfo);
187 if (itemIDList == NULL) 653 if (!itemIDList)
188 return false; 654 return false;
189 CItemIDList itemIDListHolder; 655 CItemIDList itemIDListHolder;
190 itemIDListHolder.Attach(itemIDList); 656 itemIDListHolder.Attach(itemIDList);
@@ -240,11 +706,18 @@ static bool BrowseForFolder(HWND owner, LPCTSTR title, UINT ulFlags,
240 browseInfo.lpszTitle = title; 706 browseInfo.lpszTitle = title;
241 // #endif 707 // #endif
242 browseInfo.ulFlags = ulFlags; 708 browseInfo.ulFlags = ulFlags;
243 browseInfo.lpfn = (initialFolder != NULL) ? BrowseCallbackProc : NULL; 709 browseInfo.lpfn = initialFolder ? BrowseCallbackProc : NULL;
244 browseInfo.lParam = (LPARAM)initialFolder; 710 browseInfo.lParam = (LPARAM)initialFolder;
245 return BrowseForFolder(&browseInfo, resultPath); 711 return BrowseForFolder(&browseInfo, resultPath);
246} 712}
247 713
714#ifdef Z7_OLD_WIN_SDK
715// ShlObj.h:
716#ifndef BIF_NEWDIALOGSTYLE
717#define BIF_NEWDIALOGSTYLE 0x0040
718#endif
719#endif
720
248bool BrowseForFolder(HWND owner, LPCTSTR title, 721bool BrowseForFolder(HWND owner, LPCTSTR title,
249 LPCTSTR initialFolder, CSysString &resultPath) 722 LPCTSTR initialFolder, CSysString &resultPath)
250{ 723{
@@ -259,38 +732,21 @@ bool BrowseForFolder(HWND owner, LPCTSTR title,
259#ifndef _UNICODE 732#ifndef _UNICODE
260 733
261extern "C" { 734extern "C" {
262typedef BOOL (WINAPI * Func_SHGetPathFromIDListW)(LPCITEMIDLIST pidl, LPWSTR pszPath);
263typedef LPITEMIDLIST (WINAPI * Func_SHBrowseForFolderW)(LPBROWSEINFOW lpbi); 735typedef LPITEMIDLIST (WINAPI * Func_SHBrowseForFolderW)(LPBROWSEINFOW lpbi);
264} 736}
265 737
266#define MY_CAST_FUNC (void(*)())
267// #define MY_CAST_FUNC
268
269bool GetPathFromIDList(LPCITEMIDLIST itemIDList, UString &path)
270{
271 path.Empty();
272 Func_SHGetPathFromIDListW shGetPathFromIDListW = (Func_SHGetPathFromIDListW)
273 MY_CAST_FUNC
274 ::GetProcAddress(::GetModuleHandleW(L"shell32.dll"), "SHGetPathFromIDListW");
275 if (!shGetPathFromIDListW)
276 return false;
277 const unsigned len = MAX_PATH * 2;
278 bool result = BOOLToBool(shGetPathFromIDListW(itemIDList, path.GetBuf(len)));
279 path.ReleaseBuf_CalcLen(len);
280 return result;
281}
282
283
284static bool BrowseForFolder(LPBROWSEINFOW browseInfo, UString &resultPath) 738static bool BrowseForFolder(LPBROWSEINFOW browseInfo, UString &resultPath)
285{ 739{
286 NWindows::NCOM::CComInitializer comInitializer; 740 NWindows::NCOM::CComInitializer comInitializer;
287 Func_SHBrowseForFolderW shBrowseForFolderW = (Func_SHBrowseForFolderW) 741 const
288 MY_CAST_FUNC 742 Func_SHBrowseForFolderW
289 ::GetProcAddress(::GetModuleHandleW(L"shell32.dll"), "SHBrowseForFolderW"); 743 f_SHBrowseForFolderW = Z7_GET_PROC_ADDRESS(
290 if (!shBrowseForFolderW) 744 Func_SHBrowseForFolderW, ::GetModuleHandleW(L"shell32.dll"),
745 "SHBrowseForFolderW");
746 if (!f_SHBrowseForFolderW)
291 return false; 747 return false;
292 LPITEMIDLIST itemIDList = shBrowseForFolderW(browseInfo); 748 LPITEMIDLIST itemIDList = f_SHBrowseForFolderW(browseInfo);
293 if (itemIDList == NULL) 749 if (!itemIDList)
294 return false; 750 return false;
295 CItemIDList itemIDListHolder; 751 CItemIDList itemIDListHolder;
296 itemIDListHolder.Attach(itemIDList); 752 itemIDListHolder.Attach(itemIDList);
@@ -336,7 +792,7 @@ static bool BrowseForFolder(HWND owner, LPCWSTR title, UINT ulFlags,
336 browseInfo.pszDisplayName = displayName.GetBuf(MAX_PATH); 792 browseInfo.pszDisplayName = displayName.GetBuf(MAX_PATH);
337 browseInfo.lpszTitle = title; 793 browseInfo.lpszTitle = title;
338 browseInfo.ulFlags = ulFlags; 794 browseInfo.ulFlags = ulFlags;
339 browseInfo.lpfn = (initialFolder != NULL) ? BrowseCallbackProc2 : NULL; 795 browseInfo.lpfn = initialFolder ? BrowseCallbackProc2 : NULL;
340 browseInfo.lParam = (LPARAM)initialFolder; 796 browseInfo.lParam = (LPARAM)initialFolder;
341 return BrowseForFolder(&browseInfo, resultPath); 797 return BrowseForFolder(&browseInfo, resultPath);
342} 798}
diff --git a/CPP/Windows/Shell.h b/CPP/Windows/Shell.h
index de91d3f..b4cdb30 100644
--- a/CPP/Windows/Shell.h
+++ b/CPP/Windows/Shell.h
@@ -1,17 +1,22 @@
1// Windows/Shell.h 1// Windows/Shell.h
2 2
3#ifndef __WINDOWS_SHELL_H 3#ifndef ZIP7_WINDOWS_SHELL_H
4#define __WINDOWS_SHELL_H 4#define ZIP7_WINDOWS_SHELL_H
5 5
6#include "../Common/Common.h"
6#include "../Common/MyWindows.h" 7#include "../Common/MyWindows.h"
8#if defined(__MINGW32__) || defined(__MINGW64__)
9#include <shlobj.h>
10#else
7#include <ShlObj.h> 11#include <ShlObj.h>
12#endif
8 13
9#include "../Common/MyString.h" 14#include "../Common/MyString.h"
10 15
11#include "Defs.h" 16#include "Defs.h"
12 17
13namespace NWindows{ 18namespace NWindows {
14namespace NShell{ 19namespace NShell {
15 20
16///////////////////////// 21/////////////////////////
17// CItemIDList 22// CItemIDList
@@ -20,6 +25,7 @@ namespace NShell{
20class CItemIDList 25class CItemIDList
21{ 26{
22 LPITEMIDLIST m_Object; 27 LPITEMIDLIST m_Object;
28 Z7_CLASS_NO_COPY(CItemIDList)
23public: 29public:
24 CItemIDList(): m_Object(NULL) {} 30 CItemIDList(): m_Object(NULL) {}
25 // CItemIDList(LPCITEMIDLIST itemIDList); 31 // CItemIDList(LPCITEMIDLIST itemIDList);
@@ -49,6 +55,7 @@ public:
49///////////////////////////// 55/////////////////////////////
50// CDrop 56// CDrop
51 57
58/*
52class CDrop 59class CDrop
53{ 60{
54 HDROP m_Object; 61 HDROP m_Object;
@@ -63,22 +70,51 @@ public:
63 operator HDROP() { return m_Object;} 70 operator HDROP() { return m_Object;}
64 bool QueryPoint(LPPOINT point) 71 bool QueryPoint(LPPOINT point)
65 { return BOOLToBool(::DragQueryPoint(m_Object, point)); } 72 { return BOOLToBool(::DragQueryPoint(m_Object, point)); }
66 void Finish() { ::DragFinish(m_Object); } 73 void Finish()
67 UINT QueryFile(UINT fileIndex, LPTSTR fileName, UINT fileNameSize) 74 {
68 { return ::DragQueryFile(m_Object, fileIndex, fileName, fileNameSize); } 75 ::DragFinish(m_Object);
76 }
77 UINT QueryFile(UINT fileIndex, LPTSTR fileName, UINT bufSize)
78 { return ::DragQueryFile(m_Object, fileIndex, fileName, bufSize); }
69 #ifndef _UNICODE 79 #ifndef _UNICODE
70 UINT QueryFile(UINT fileIndex, LPWSTR fileName, UINT fileNameSize) 80 UINT QueryFile(UINT fileIndex, LPWSTR fileName, UINT bufSize)
71 { return ::DragQueryFileW(m_Object, fileIndex, fileName, fileNameSize); } 81 { return ::DragQueryFileW(m_Object, fileIndex, fileName, bufSize); }
72 #endif 82 #endif
73 UINT QueryCountOfFiles(); 83 UINT QueryCountOfFiles();
74 UString QueryFileName(UINT fileIndex); 84 void QueryFileName(UINT fileIndex, UString &fileName);
75 void QueryFileNames(UStringVector &fileNames); 85 void QueryFileNames(UStringVector &fileNames);
76}; 86};
77 87*/
78#endif 88#endif
79 89
80///////////////////////////// 90struct CFileAttribs
81// Functions 91{
92 int FirstDirIndex;
93 // DWORD Sum;
94 // DWORD Product;
95 // CRecordVector<DWORD> Vals;
96 // CRecordVector<bool> IsDirVector;
97
98 CFileAttribs()
99 {
100 Clear();
101 }
102
103 void Clear()
104 {
105 FirstDirIndex = -1;
106 // Sum = 0;
107 // Product = 0;
108 // IsDirVector.Clear();
109 }
110};
111
112
113/* read pathnames from HDROP or SHELLIDLIST.
114 The parser can return E_INVALIDARG, if there is some unexpected data in dataObject */
115HRESULT DataObject_GetData_HDROP_or_IDLIST_Names(IDataObject *dataObject, UStringVector &names);
116
117HRESULT DataObject_GetData_FILE_ATTRS(IDataObject *dataObject, CFileAttribs &attribs);
82 118
83bool GetPathFromIDList(LPCITEMIDLIST itemIDList, CSysString &path); 119bool GetPathFromIDList(LPCITEMIDLIST itemIDList, CSysString &path);
84bool BrowseForFolder(LPBROWSEINFO lpbi, CSysString &resultPath); 120bool BrowseForFolder(LPBROWSEINFO lpbi, CSysString &resultPath);
diff --git a/CPP/Windows/StdAfx.h b/CPP/Windows/StdAfx.h
index 1766dfa..bd5084f 100644
--- a/CPP/Windows/StdAfx.h
+++ b/CPP/Windows/StdAfx.h
@@ -1,7 +1,11 @@
1// StdAfx.h 1// StdAfx.h
2 2
3#ifndef __STDAFX_H 3#ifndef ZIP7_INC_STDAFX_H
4#define __STDAFX_H 4#define ZIP7_INC_STDAFX_H
5
6#if defined(_MSC_VER) && _MSC_VER >= 1800
7#pragma warning(disable : 4464) // relative include path contains '..'
8#endif
5 9
6#include "../Common/Common.h" 10#include "../Common/Common.h"
7 11
diff --git a/CPP/Windows/Synchronization.cpp b/CPP/Windows/Synchronization.cpp
index fbf919d..d5542af 100644
--- a/CPP/Windows/Synchronization.cpp
+++ b/CPP/Windows/Synchronization.cpp
@@ -19,6 +19,30 @@ namespace NSynchronization {
19DWORD WaitForMultipleObjects(DWORD count, const HANDLE *handles, BOOL wait_all, DWORD timeout); 19DWORD WaitForMultipleObjects(DWORD count, const HANDLE *handles, BOOL wait_all, DWORD timeout);
20*/ 20*/
21 21
22/* clang: we need to place some virtual functions in cpp file to rid off the warning:
23 'CBaseHandle_WFMO' has no out-of-line virtual method definitions;
24 its vtable will be emitted in every translation unit */
25CBaseHandle_WFMO::~CBaseHandle_WFMO()
26{
27}
28
29bool CBaseEvent_WFMO::IsSignaledAndUpdate()
30{
31 if (this->_state == false)
32 return false;
33 if (this->_manual_reset == false)
34 this->_state = false;
35 return true;
36}
37
38bool CSemaphore_WFMO::IsSignaledAndUpdate()
39{
40 if (this->_count == 0)
41 return false;
42 this->_count--;
43 return true;
44}
45
22DWORD WINAPI WaitForMultiObj_Any_Infinite(DWORD count, const CHandle_WFMO *handles) 46DWORD WINAPI WaitForMultiObj_Any_Infinite(DWORD count, const CHandle_WFMO *handles)
23{ 47{
24 if (count < 1) 48 if (count < 1)
diff --git a/CPP/Windows/Synchronization.h b/CPP/Windows/Synchronization.h
index 7d2e8d2..afd03d2 100644
--- a/CPP/Windows/Synchronization.h
+++ b/CPP/Windows/Synchronization.h
@@ -1,7 +1,7 @@
1// Windows/Synchronization.h 1// Windows/Synchronization.h
2 2
3#ifndef __WINDOWS_SYNCHRONIZATION_H 3#ifndef ZIP7_INC_WINDOWS_SYNCHRONIZATION_H
4#define __WINDOWS_SYNCHRONIZATION_H 4#define ZIP7_INC_WINDOWS_SYNCHRONIZATION_H
5 5
6#include "../../C/Threads.h" 6#include "../../C/Threads.h"
7 7
@@ -32,14 +32,14 @@ public:
32 WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL) 32 WRes Create(bool manualReset, bool initiallyOwn, LPCTSTR name = NULL, LPSECURITY_ATTRIBUTES sa = NULL)
33 { 33 {
34 _object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name); 34 _object = ::CreateEvent(sa, BoolToBOOL(manualReset), BoolToBOOL(initiallyOwn), name);
35 if (name == NULL && _object != 0) 35 if (name == NULL && _object != NULL)
36 return 0; 36 return 0;
37 return ::GetLastError(); 37 return ::GetLastError();
38 } 38 }
39 WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name) 39 WRes Open(DWORD desiredAccess, bool inheritHandle, LPCTSTR name)
40 { 40 {
41 _object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name); 41 _object = ::OpenEvent(desiredAccess, BoolToBOOL(inheritHandle), name);
42 if (_object != 0) 42 if (_object != NULL)
43 return 0; 43 return 0;
44 return ::GetLastError(); 44 return ::GetLastError();
45 } 45 }
@@ -227,8 +227,8 @@ public:
227 } 227 }
228 WRes Create() 228 WRes Create()
229 { 229 {
230 RINOK(::pthread_mutex_init(&_mutex, 0)); 230 RINOK(::pthread_mutex_init(&_mutex, NULL))
231 WRes ret = ::pthread_cond_init(&_cond, 0); 231 const WRes ret = ::pthread_cond_init(&_cond, NULL);
232 _isValid = 1; 232 _isValid = 1;
233 return ret; 233 return ret;
234 } 234 }
@@ -246,8 +246,8 @@ public:
246 } 246 }
247 WRes LeaveAndSignal() 247 WRes LeaveAndSignal()
248 { 248 {
249 WRes res1 = ::pthread_cond_broadcast(&_cond); 249 const WRes res1 = ::pthread_cond_broadcast(&_cond);
250 WRes res2 = ::pthread_mutex_unlock(&_mutex); 250 const WRes res2 = ::pthread_mutex_unlock(&_mutex);
251 return (res2 ? res2 : res1); 251 return (res2 ? res2 : res1);
252 } 252 }
253}; 253};
@@ -268,6 +268,7 @@ struct CBaseHandle_WFMO MY_UNCOPYABLE
268 CSynchro *_sync; 268 CSynchro *_sync;
269 269
270 CBaseHandle_WFMO(): _sync(NULL) {} 270 CBaseHandle_WFMO(): _sync(NULL) {}
271 virtual ~CBaseHandle_WFMO();
271 272
272 operator CHandle_WFMO() { return this; } 273 operator CHandle_WFMO() { return this; }
273 virtual bool IsSignaledAndUpdate() = 0; 274 virtual bool IsSignaledAndUpdate() = 0;
@@ -283,7 +284,7 @@ public:
283 284
284 // bool IsCreated() { return (this->_sync != NULL); } 285 // bool IsCreated() { return (this->_sync != NULL); }
285 // CBaseEvent_WFMO() { ; } 286 // CBaseEvent_WFMO() { ; }
286 ~CBaseEvent_WFMO() { Close(); } 287 // ~CBaseEvent_WFMO() Z7_override { Close(); }
287 288
288 WRes Close() { this->_sync = NULL; return 0; } 289 WRes Close() { this->_sync = NULL; return 0; }
289 290
@@ -299,37 +300,30 @@ public:
299 300
300 WRes Set() 301 WRes Set()
301 { 302 {
302 RINOK(this->_sync->Enter()); 303 RINOK(this->_sync->Enter())
303 this->_state = true; 304 this->_state = true;
304 return this->_sync->LeaveAndSignal(); 305 return this->_sync->LeaveAndSignal();
305 } 306 }
306 307
307 WRes Reset() 308 WRes Reset()
308 { 309 {
309 RINOK(this->_sync->Enter()); 310 RINOK(this->_sync->Enter())
310 this->_state = false; 311 this->_state = false;
311 return this->_sync->Leave(); 312 return this->_sync->Leave();
312 } 313 }
313 314
314 virtual bool IsSignaledAndUpdate() 315 virtual bool IsSignaledAndUpdate() Z7_override;
315 {
316 if (this->_state == false)
317 return false;
318 if (this->_manual_reset == false)
319 this->_state = false;
320 return true;
321 }
322}; 316};
323 317
324 318
325class CManualResetEvent_WFMO: public CBaseEvent_WFMO 319class CManualResetEvent_WFMO Z7_final: public CBaseEvent_WFMO
326{ 320{
327public: 321public:
328 WRes Create(CSynchro *sync, bool initiallyOwn = false) { return CBaseEvent_WFMO::Create(sync, true, initiallyOwn); } 322 WRes Create(CSynchro *sync, bool initiallyOwn = false) { return CBaseEvent_WFMO::Create(sync, true, initiallyOwn); }
329}; 323};
330 324
331 325
332class CAutoResetEvent_WFMO: public CBaseEvent_WFMO 326class CAutoResetEvent_WFMO Z7_final: public CBaseEvent_WFMO
333{ 327{
334public: 328public:
335 WRes Create(CSynchro *sync) { return CBaseEvent_WFMO::Create(sync, false, false); } 329 WRes Create(CSynchro *sync) { return CBaseEvent_WFMO::Create(sync, false, false); }
@@ -340,7 +334,7 @@ public:
340}; 334};
341 335
342 336
343class CSemaphore_WFMO : public CBaseHandle_WFMO 337class CSemaphore_WFMO Z7_final: public CBaseHandle_WFMO
344{ 338{
345 UInt32 _count; 339 UInt32 _count;
346 UInt32 _maxCount; 340 UInt32 _maxCount;
@@ -365,11 +359,11 @@ public:
365 if (releaseCount < 1) 359 if (releaseCount < 1)
366 return EINVAL; 360 return EINVAL;
367 361
368 RINOK(this->_sync->Enter()); 362 RINOK(this->_sync->Enter())
369 UInt32 newCount = this->_count + releaseCount; 363 UInt32 newCount = this->_count + releaseCount;
370 if (newCount > this->_maxCount) 364 if (newCount > this->_maxCount)
371 { 365 {
372 RINOK(this->_sync->Leave()); 366 RINOK(this->_sync->Leave())
373 return ERROR_TOO_MANY_POSTS; // EINVAL 367 return ERROR_TOO_MANY_POSTS; // EINVAL
374 } 368 }
375 this->_count = newCount; 369 this->_count = newCount;
@@ -377,13 +371,7 @@ public:
377 return this->_sync->LeaveAndSignal(); 371 return this->_sync->LeaveAndSignal();
378 } 372 }
379 373
380 virtual bool IsSignaledAndUpdate() 374 virtual bool IsSignaledAndUpdate() Z7_override;
381 {
382 if (this->_count == 0)
383 return false;
384 this->_count--;
385 return true;
386 }
387}; 375};
388 376
389#endif // _WIN32 377#endif // _WIN32
diff --git a/CPP/Windows/System.cpp b/CPP/Windows/System.cpp
index 3a14b77..dbe287a 100644
--- a/CPP/Windows/System.cpp
+++ b/CPP/Windows/System.cpp
@@ -4,6 +4,7 @@
4 4
5#ifndef _WIN32 5#ifndef _WIN32
6#include <unistd.h> 6#include <unistd.h>
7#include <limits.h>
7#ifdef __APPLE__ 8#ifdef __APPLE__
8#include <sys/sysctl.h> 9#include <sys/sysctl.h>
9#else 10#else
@@ -74,7 +75,7 @@ BOOL CProcessAffinity::Get()
74 return TRUE; 75 return TRUE;
75 */ 76 */
76 77
77 #ifdef _7ZIP_AFFINITY_SUPPORTED 78 #ifdef Z7_AFFINITY_SUPPORTED
78 79
79 // numSysThreads = sysconf(_SC_NPROCESSORS_ONLN); // The number of processors currently online 80 // numSysThreads = sysconf(_SC_NPROCESSORS_ONLN); // The number of processors currently online
80 if (sched_getaffinity(0, sizeof(cpu_set), &cpu_set) != 0) 81 if (sched_getaffinity(0, sizeof(cpu_set), &cpu_set) != 0)
@@ -93,7 +94,7 @@ BOOL CProcessAffinity::Get()
93 94
94UInt32 GetNumberOfProcessors() 95UInt32 GetNumberOfProcessors()
95{ 96{
96 #ifndef _7ZIP_ST 97 #ifndef Z7_ST
97 long n = sysconf(_SC_NPROCESSORS_CONF); // The number of processors configured 98 long n = sysconf(_SC_NPROCESSORS_CONF); // The number of processors configured
98 if (n < 1) 99 if (n < 1)
99 n = 1; 100 n = 1;
@@ -110,7 +111,8 @@ UInt32 GetNumberOfProcessors()
110 111
111#ifndef UNDER_CE 112#ifndef UNDER_CE
112 113
113#if !defined(_WIN64) && defined(__GNUC__) 114#if !defined(_WIN64) && \
115 (defined(__MINGW32_VERSION) || defined(Z7_OLD_WIN_SDK))
114 116
115typedef struct _MY_MEMORYSTATUSEX { 117typedef struct _MY_MEMORYSTATUSEX {
116 DWORD dwLength; 118 DWORD dwLength;
@@ -131,7 +133,7 @@ typedef struct _MY_MEMORYSTATUSEX {
131 133
132#endif 134#endif
133 135
134typedef BOOL (WINAPI *GlobalMemoryStatusExP)(MY_LPMEMORYSTATUSEX lpBuffer); 136typedef BOOL (WINAPI *Func_GlobalMemoryStatusEx)(MY_LPMEMORYSTATUSEX lpBuffer);
135 137
136#endif // !UNDER_CE 138#endif // !UNDER_CE
137 139
@@ -155,9 +157,11 @@ bool GetRamSize(UInt64 &size)
155 #else 157 #else
156 158
157 #ifndef UNDER_CE 159 #ifndef UNDER_CE
158 GlobalMemoryStatusExP globalMemoryStatusEx = (GlobalMemoryStatusExP) 160 const
159 (void *)::GetProcAddress(::GetModuleHandleA("kernel32.dll"), "GlobalMemoryStatusEx"); 161 Func_GlobalMemoryStatusEx fn = Z7_GET_PROC_ADDRESS(
160 if (globalMemoryStatusEx && globalMemoryStatusEx(&stat)) 162 Func_GlobalMemoryStatusEx, ::GetModuleHandleA("kernel32.dll"),
163 "GlobalMemoryStatusEx");
164 if (fn && fn(&stat))
161 { 165 {
162 size = MyMin(stat.ullTotalVirtual, stat.ullTotalPhys); 166 size = MyMin(stat.ullTotalVirtual, stat.ullTotalPhys);
163 return true; 167 return true;
@@ -231,4 +235,44 @@ bool GetRamSize(UInt64 &size)
231 235
232#endif 236#endif
233 237
238
239unsigned long Get_File_OPEN_MAX()
240{
241 #ifdef _WIN32
242 return (1 << 24) - (1 << 16); // ~16M handles
243 #else
244 // some linux versions have default open file limit for user process of 1024 files.
245 long n = sysconf(_SC_OPEN_MAX);
246 // n = -1; // for debug
247 // n = 9; // for debug
248 if (n < 1)
249 {
250 // n = OPEN_MAX; // ???
251 // n = FOPEN_MAX; // = 16 : <stdio.h>
252 #ifdef _POSIX_OPEN_MAX
253 n = _POSIX_OPEN_MAX; // = 20 : <limits.h>
254 #else
255 n = 30; // our limit
256 #endif
257 }
258 return (unsigned long)n;
259 #endif
260}
261
262unsigned Get_File_OPEN_MAX_Reduced_for_3_tasks()
263{
264 unsigned long numFiles_OPEN_MAX = NSystem::Get_File_OPEN_MAX();
265 const unsigned delta = 10; // the reserve for another internal needs of process
266 if (numFiles_OPEN_MAX > delta)
267 numFiles_OPEN_MAX -= delta;
268 else
269 numFiles_OPEN_MAX = 1;
270 numFiles_OPEN_MAX /= 3; // we suppose that we have up to 3 tasks in total for multiple file processing
271 numFiles_OPEN_MAX = MyMax(numFiles_OPEN_MAX, (unsigned long)3);
272 unsigned n = (UInt32)(UInt32)-1;
273 if (n > numFiles_OPEN_MAX)
274 n = (unsigned)numFiles_OPEN_MAX;
275 return n;
276}
277
234}} 278}}
diff --git a/CPP/Windows/System.h b/CPP/Windows/System.h
index 23cb0da..0650007 100644
--- a/CPP/Windows/System.h
+++ b/CPP/Windows/System.h
@@ -1,7 +1,7 @@
1// Windows/System.h 1// Windows/System.h
2 2
3#ifndef __WINDOWS_SYSTEM_H 3#ifndef ZIP7_INC_WINDOWS_SYSTEM_H
4#define __WINDOWS_SYSTEM_H 4#define ZIP7_INC_WINDOWS_SYSTEM_H
5 5
6#ifndef _WIN32 6#ifndef _WIN32
7// #include <sched.h> 7// #include <sched.h>
@@ -9,11 +9,11 @@
9#endif 9#endif
10 10
11#include "../Common/MyTypes.h" 11#include "../Common/MyTypes.h"
12#include "../Common/MyWindows.h"
12 13
13namespace NWindows { 14namespace NWindows {
14namespace NSystem { 15namespace NSystem {
15 16
16
17#ifdef _WIN32 17#ifdef _WIN32
18 18
19UInt32 CountAffinity(DWORD_PTR mask); 19UInt32 CountAffinity(DWORD_PTR mask);
@@ -64,7 +64,7 @@ struct CProcessAffinity
64 UInt32 GetNumSystemThreads() const { return (UInt32)numSysThreads; } 64 UInt32 GetNumSystemThreads() const { return (UInt32)numSysThreads; }
65 BOOL Get(); 65 BOOL Get();
66 66
67 #ifdef _7ZIP_AFFINITY_SUPPORTED 67 #ifdef Z7_AFFINITY_SUPPORTED
68 68
69 CCpuSet cpu_set; 69 CCpuSet cpu_set;
70 70
@@ -86,7 +86,7 @@ struct CProcessAffinity
86 return sched_setaffinity(0, sizeof(cpu_set), &cpu_set) == 0; 86 return sched_setaffinity(0, sizeof(cpu_set), &cpu_set) == 0;
87 } 87 }
88 88
89 #else 89 #else // Z7_AFFINITY_SUPPORTED
90 90
91 void InitST() 91 void InitST()
92 { 92 {
@@ -114,16 +114,19 @@ struct CProcessAffinity
114 return FALSE; 114 return FALSE;
115 } 115 }
116 116
117 #endif 117 #endif // Z7_AFFINITY_SUPPORTED
118}; 118};
119 119
120#endif 120#endif // _WIN32
121 121
122 122
123UInt32 GetNumberOfProcessors(); 123UInt32 GetNumberOfProcessors();
124 124
125bool GetRamSize(UInt64 &size); // returns false, if unknown ram size 125bool GetRamSize(UInt64 &size); // returns false, if unknown ram size
126 126
127unsigned long Get_File_OPEN_MAX();
128unsigned Get_File_OPEN_MAX_Reduced_for_3_tasks();
129
127}} 130}}
128 131
129#endif 132#endif
diff --git a/CPP/Windows/SystemInfo.cpp b/CPP/Windows/SystemInfo.cpp
index d882a8e..6bafc80 100644
--- a/CPP/Windows/SystemInfo.cpp
+++ b/CPP/Windows/SystemInfo.cpp
@@ -102,38 +102,44 @@ static void PrintHex(AString &s, UInt64 v)
102 102
103#ifdef MY_CPU_X86_OR_AMD64 103#ifdef MY_CPU_X86_OR_AMD64
104 104
105Z7_NO_INLINE
105static void PrintCpuChars(AString &s, UInt32 v) 106static void PrintCpuChars(AString &s, UInt32 v)
106{ 107{
107 for (int j = 0; j < 4; j++) 108 for (unsigned j = 0; j < 4; j++)
108 { 109 {
109 Byte b = (Byte)(v & 0xFF); 110 Byte b = (Byte)(v & 0xFF);
110 v >>= 8; 111 v >>= 8;
111 if (b == 0) 112 if (b == 0)
112 break; 113 break;
113 s += (char)b; 114 if (b >= 0x20 && b <= 0x7f)
115 s += (char)b;
116 else
117 {
118 s += '[';
119 char temp[16];
120 ConvertUInt32ToHex(b, temp);
121 s += temp;
122 s += ']';
123 }
114 } 124 }
115} 125}
116 126
117 127
118static void x86cpuid_to_String(const Cx86cpuid &c, AString &s, AString &ver) 128static void x86cpuid_to_String(AString &s)
119{ 129{
120 s.Empty(); 130 s.Empty();
121 131
122 UInt32 maxFunc2 = 0; 132 UInt32 a[4];
123 UInt32 t[3]; 133 // cpuid was called already. So we don't check for cpuid availability here
134 z7_x86_cpuid(a, 0x80000000);
124 135
125 MyCPUID(0x80000000, &maxFunc2, &t[0], &t[1], &t[2]); 136 if (a[0] >= 0x80000004) // if (maxFunc2 >= hi+4) the full name is available
126
127 bool fullNameIsAvail = (maxFunc2 >= 0x80000004);
128
129 if (fullNameIsAvail)
130 { 137 {
131 for (unsigned i = 0; i < 3; i++) 138 for (unsigned i = 0; i < 3; i++)
132 { 139 {
133 UInt32 d[4] = { 0 }; 140 z7_x86_cpuid(a, 0x80000002 + i);
134 MyCPUID(0x80000002 + i, &d[0], &d[1], &d[2], &d[3]);
135 for (unsigned j = 0; j < 4; j++) 141 for (unsigned j = 0; j < 4; j++)
136 PrintCpuChars(s, d[j]); 142 PrintCpuChars(s, a[j]);
137 } 143 }
138 } 144 }
139 145
@@ -141,16 +147,14 @@ static void x86cpuid_to_String(const Cx86cpuid &c, AString &s, AString &ver)
141 147
142 if (s.IsEmpty()) 148 if (s.IsEmpty())
143 { 149 {
144 for (int i = 0; i < 3; i++) 150 z7_x86_cpuid(a, 0);
145 PrintCpuChars(s, c.vendor[i]); 151 for (unsigned i = 1; i < 4; i++)
152 {
153 const unsigned j = (i ^ (i >> 1));
154 PrintCpuChars(s, a[j]);
155 }
146 s.Trim(); 156 s.Trim();
147 } 157 }
148
149 {
150 char temp[32];
151 ConvertUInt32ToHex(c.ver, temp);
152 ver += temp;
153 }
154} 158}
155 159
156/* 160/*
@@ -184,7 +188,7 @@ static void x86cpuid_all_to_String(AString &s)
184 { 188 {
185 char temp[32]; 189 char temp[32];
186 ConvertUInt32ToHex8Digits(d[i], temp); 190 ConvertUInt32ToHex8Digits(d[i], temp);
187 s += " "; 191 s.Add_Space();
188 s += temp; 192 s += temp;
189 } 193 }
190 } 194 }
@@ -215,12 +219,12 @@ static const char * const k_PROCESSOR_ARCHITECTURE[] =
215 , "ARM32_ON_WIN64" 219 , "ARM32_ON_WIN64"
216}; 220};
217 221
218#define MY__PROCESSOR_ARCHITECTURE_INTEL 0 222#define Z7_WIN_PROCESSOR_ARCHITECTURE_INTEL 0
219#define MY__PROCESSOR_ARCHITECTURE_AMD64 9 223#define Z7_WIN_PROCESSOR_ARCHITECTURE_AMD64 9
220 224
221 225
222#define MY__PROCESSOR_INTEL_PENTIUM 586 226#define Z7_WIN_PROCESSOR_INTEL_PENTIUM 586
223#define MY__PROCESSOR_AMD_X8664 8664 227#define Z7_WIN_PROCESSOR_AMD_X8664 8664
224 228
225/* 229/*
226static const CUInt32PCharPair k_PROCESSOR[] = 230static const CUInt32PCharPair k_PROCESSOR[] =
@@ -303,19 +307,20 @@ static const char * const k_PF[] =
303#endif 307#endif
304 308
305 309
306#ifdef _WIN32 310static void PrintPage(AString &s, UInt64 v)
307
308static void PrintPage(AString &s, UInt32 v)
309{ 311{
310 if ((v & 0x3FF) == 0) 312 const char *t = "B";
313 if ((v & 0x3ff) == 0)
311 { 314 {
312 s.Add_UInt32(v >> 10); 315 v >>= 10;
313 s += "K"; 316 t = "KB";
314 } 317 }
315 else 318 s.Add_UInt64(v);
316 s.Add_UInt32(v >> 10); 319 s += t;
317} 320}
318 321
322#ifdef _WIN32
323
319static AString TypeToString2(const char * const table[], unsigned num, UInt32 value) 324static AString TypeToString2(const char * const table[], unsigned num, UInt32 value)
320{ 325{
321 char sz[16]; 326 char sz[16];
@@ -330,7 +335,7 @@ static AString TypeToString2(const char * const table[], unsigned num, UInt32 va
330 return (AString)p; 335 return (AString)p;
331} 336}
332 337
333// #if defined(_7ZIP_LARGE_PAGES) || defined(_WIN32) 338// #if defined(Z7_LARGE_PAGES) || defined(_WIN32)
334// #ifdef _WIN32 339// #ifdef _WIN32
335void PrintSize_KMGT_Or_Hex(AString &s, UInt64 v) 340void PrintSize_KMGT_Or_Hex(AString &s, UInt64 v)
336{ 341{
@@ -342,32 +347,32 @@ void PrintSize_KMGT_Or_Hex(AString &s, UInt64 v)
342 }}}} 347 }}}}
343 else 348 else
344 { 349 {
350 // s += "0x";
345 PrintHex(s, v); 351 PrintHex(s, v);
346 return; 352 return;
347 } 353 }
348 char temp[32]; 354 s.Add_UInt64(v);
349 ConvertUInt64ToString(v, temp);
350 s += temp;
351 if (c) 355 if (c)
352 s += c; 356 s += c;
357 s += 'B';
353} 358}
354// #endif 359// #endif
355// #endif 360// #endif
356 361
357static void SysInfo_To_String(AString &s, const SYSTEM_INFO &si) 362static void SysInfo_To_String(AString &s, const SYSTEM_INFO &si)
358{ 363{
359 s += TypeToString2(k_PROCESSOR_ARCHITECTURE, ARRAY_SIZE(k_PROCESSOR_ARCHITECTURE), si.wProcessorArchitecture); 364 s += TypeToString2(k_PROCESSOR_ARCHITECTURE, Z7_ARRAY_SIZE(k_PROCESSOR_ARCHITECTURE), si.wProcessorArchitecture);
360 365
361 if (!( (si.wProcessorArchitecture == MY__PROCESSOR_ARCHITECTURE_INTEL && si.dwProcessorType == MY__PROCESSOR_INTEL_PENTIUM) 366 if (!( (si.wProcessorArchitecture == Z7_WIN_PROCESSOR_ARCHITECTURE_INTEL && si.dwProcessorType == Z7_WIN_PROCESSOR_INTEL_PENTIUM)
362 || (si.wProcessorArchitecture == MY__PROCESSOR_ARCHITECTURE_AMD64 && si.dwProcessorType == MY__PROCESSOR_AMD_X8664))) 367 || (si.wProcessorArchitecture == Z7_WIN_PROCESSOR_ARCHITECTURE_AMD64 && si.dwProcessorType == Z7_WIN_PROCESSOR_AMD_X8664)))
363 { 368 {
364 s += " "; 369 s.Add_Space();
365 // s += TypePairToString(k_PROCESSOR, ARRAY_SIZE(k_PROCESSOR), si.dwProcessorType); 370 // s += TypePairToString(k_PROCESSOR, Z7_ARRAY_SIZE(k_PROCESSOR), si.dwProcessorType);
366 s.Add_UInt32(si.dwProcessorType); 371 s.Add_UInt32(si.dwProcessorType);
367 } 372 }
368 s += " "; 373 s.Add_Space();
369 PrintHex(s, si.wProcessorLevel); 374 PrintHex(s, si.wProcessorLevel);
370 s += "."; 375 s.Add_Dot();
371 PrintHex(s, si.wProcessorRevision); 376 PrintHex(s, si.wProcessorRevision);
372 if ((UInt64)si.dwActiveProcessorMask + 1 != ((UInt64)1 << si.dwNumberOfProcessors)) 377 if ((UInt64)si.dwActiveProcessorMask + 1 != ((UInt64)1 << si.dwNumberOfProcessors))
373 if ((UInt64)si.dwActiveProcessorMask + 1 != 0 || si.dwNumberOfProcessors != sizeof(UInt64) * 8) 378 if ((UInt64)si.dwActiveProcessorMask + 1 != 0 || si.dwNumberOfProcessors != sizeof(UInt64) * 8)
@@ -387,9 +392,9 @@ static void SysInfo_To_String(AString &s, const SYSTEM_INFO &si)
387 s += " gran:"; 392 s += " gran:";
388 PrintPage(s, si.dwAllocationGranularity); 393 PrintPage(s, si.dwAllocationGranularity);
389 } 394 }
390 s += " "; 395 s.Add_Space();
391 396
392 DWORD_PTR minAdd = (DWORD_PTR)si.lpMinimumApplicationAddress; 397 const DWORD_PTR minAdd = (DWORD_PTR)si.lpMinimumApplicationAddress;
393 UInt64 maxSize = (UInt64)(DWORD_PTR)si.lpMaximumApplicationAddress + 1; 398 UInt64 maxSize = (UInt64)(DWORD_PTR)si.lpMaximumApplicationAddress + 1;
394 const UInt32 kReserveSize = ((UInt32)1 << 16); 399 const UInt32 kReserveSize = ((UInt32)1 << 16);
395 if (minAdd != kReserveSize) 400 if (minAdd != kReserveSize)
@@ -419,7 +424,7 @@ static void Add_sysctlbyname_to_String(const char *name, AString &s)
419{ 424{
420 size_t bufSize = 256; 425 size_t bufSize = 256;
421 char buf[256]; 426 char buf[256];
422 if (My_sysctlbyname_Get(name, &buf, &bufSize) == 0) 427 if (z7_sysctlbyname_Get(name, &buf, &bufSize) == 0)
423 s += buf; 428 s += buf;
424} 429}
425#endif 430#endif
@@ -440,12 +445,14 @@ void GetSysInfo(AString &s1, AString &s2)
440 } 445 }
441 446
442 #if !defined(_WIN64) && !defined(UNDER_CE) 447 #if !defined(_WIN64) && !defined(UNDER_CE)
443 Func_GetNativeSystemInfo fn_GetNativeSystemInfo = (Func_GetNativeSystemInfo)(void *)GetProcAddress( 448 const
444 GetModuleHandleA("kernel32.dll"), "GetNativeSystemInfo"); 449 Func_GetNativeSystemInfo fn = Z7_GET_PROC_ADDRESS(
445 if (fn_GetNativeSystemInfo) 450 Func_GetNativeSystemInfo, GetModuleHandleA("kernel32.dll"),
451 "GetNativeSystemInfo");
452 if (fn)
446 { 453 {
447 SYSTEM_INFO si2; 454 SYSTEM_INFO si2;
448 fn_GetNativeSystemInfo(&si2); 455 fn(&si2);
449 // if (memcmp(&si, &si2, sizeof(si)) != 0) 456 // if (memcmp(&si, &si2, sizeof(si)) != 0)
450 { 457 {
451 // s += " - "; 458 // s += " - ";
@@ -500,18 +507,20 @@ void CCpuName::Fill()
500 507
501 #ifdef MY_CPU_X86_OR_AMD64 508 #ifdef MY_CPU_X86_OR_AMD64
502 { 509 {
503 Cx86cpuid cpuid; 510 #if !defined(MY_CPU_AMD64)
504 if (x86cpuid_CheckAndRead(&cpuid)) 511 if (!z7_x86_cpuid_GetMaxFunc())
505 { 512 s += "x86";
506 x86cpuid_to_String(cpuid, s, Revision);
507 }
508 else 513 else
509 {
510 #ifdef MY_CPU_AMD64
511 s += "x64";
512 #else
513 s += "x86";
514 #endif 514 #endif
515 {
516 x86cpuid_to_String(s);
517 {
518 UInt32 a[4];
519 z7_x86_cpuid(a, 1);
520 char temp[16];
521 ConvertUInt32ToHex(a[0], temp);
522 Revision += temp;
523 }
515 } 524 }
516 } 525 }
517 #elif defined(__APPLE__) 526 #elif defined(__APPLE__)
@@ -534,12 +543,12 @@ void CCpuName::Fill()
534 { 543 {
535 AString s2; 544 AString s2;
536 UInt32 v = 0; 545 UInt32 v = 0;
537 if (My_sysctlbyname_Get_UInt32("machdep.cpu.core_count", &v) == 0) 546 if (z7_sysctlbyname_Get_UInt32("machdep.cpu.core_count", &v) == 0)
538 { 547 {
539 s2.Add_UInt32(v); 548 s2.Add_UInt32(v);
540 s2 += 'C'; 549 s2 += 'C';
541 } 550 }
542 if (My_sysctlbyname_Get_UInt32("machdep.cpu.thread_count", &v) == 0) 551 if (z7_sysctlbyname_Get_UInt32("machdep.cpu.thread_count", &v) == 0)
543 { 552 {
544 s2.Add_UInt32(v); 553 s2.Add_UInt32(v);
545 s2 += 'T'; 554 s2 += 'T';
@@ -561,7 +570,7 @@ void CCpuName::Fill()
561 LONG res[2]; 570 LONG res[2];
562 CByteBuffer bufs[2]; 571 CByteBuffer bufs[2];
563 { 572 {
564 for (int i = 0; i < 2; i++) 573 for (unsigned i = 0; i < 2; i++)
565 { 574 {
566 UInt32 size = 0; 575 UInt32 size = 0;
567 res[i] = key.QueryValue(i == 0 ? 576 res[i] = key.QueryValue(i == 0 ?
@@ -574,7 +583,7 @@ void CCpuName::Fill()
574 } 583 }
575 if (res[0] == ERROR_SUCCESS || res[1] == ERROR_SUCCESS) 584 if (res[0] == ERROR_SUCCESS || res[1] == ERROR_SUCCESS)
576 { 585 {
577 for (int i = 0; i < 2; i++) 586 for (unsigned i = 0; i < 2; i++)
578 { 587 {
579 if (i == 1) 588 if (i == 1)
580 Microcode += "->"; 589 Microcode += "->";
@@ -598,7 +607,7 @@ void CCpuName::Fill()
598 #endif 607 #endif
599 608
600 609
601 #ifdef _7ZIP_LARGE_PAGES 610 #ifdef Z7_LARGE_PAGES
602 Add_LargePages_String(LargePages); 611 Add_LargePages_String(LargePages);
603 #endif 612 #endif
604} 613}
@@ -608,7 +617,7 @@ void AddCpuFeatures(AString &s)
608{ 617{
609 #ifdef _WIN32 618 #ifdef _WIN32
610 // const unsigned kNumFeatures_Extra = 32; // we check also for unknown features 619 // const unsigned kNumFeatures_Extra = 32; // we check also for unknown features
611 // const unsigned kNumFeatures = ARRAY_SIZE(k_PF) + kNumFeatures_Extra; 620 // const unsigned kNumFeatures = Z7_ARRAY_SIZE(k_PF) + kNumFeatures_Extra;
612 const unsigned kNumFeatures = 64; 621 const unsigned kNumFeatures = 64;
613 UInt64 flags = 0; 622 UInt64 flags = 0;
614 for (unsigned i = 0; i < kNumFeatures; i++) 623 for (unsigned i = 0; i < kNumFeatures; i++)
@@ -617,7 +626,7 @@ void AddCpuFeatures(AString &s)
617 { 626 {
618 flags += (UInt64)1 << i; 627 flags += (UInt64)1 << i;
619 // s.Add_Space_if_NotEmpty(); 628 // s.Add_Space_if_NotEmpty();
620 // s += TypeToString2(k_PF, ARRAY_SIZE(k_PF), i); 629 // s += TypeToString2(k_PF, Z7_ARRAY_SIZE(k_PF), i);
621 } 630 }
622 } 631 }
623 s.Add_OptSpaced("f:"); 632 s.Add_OptSpaced("f:");
@@ -626,11 +635,10 @@ void AddCpuFeatures(AString &s)
626 #elif defined(__APPLE__) 635 #elif defined(__APPLE__)
627 { 636 {
628 UInt32 v = 0; 637 UInt32 v = 0;
629 if (My_sysctlbyname_Get_UInt32("hw.pagesize", &v) == 0) 638 if (z7_sysctlbyname_Get_UInt32("hw.pagesize", &v) == 0)
630 { 639 {
631 s += "PageSize:"; 640 s.Add_OptSpaced("PageSize:");
632 s.Add_UInt32(v >> 10); 641 PrintPage(s, v);
633 s += "KB";
634 } 642 }
635 } 643 }
636 644
@@ -639,10 +647,8 @@ void AddCpuFeatures(AString &s)
639 const long v = sysconf(_SC_PAGESIZE); 647 const long v = sysconf(_SC_PAGESIZE);
640 if (v != -1) 648 if (v != -1)
641 { 649 {
642 s.Add_Space_if_NotEmpty(); 650 s.Add_OptSpaced("PageSize:");
643 s += "PageSize:"; 651 PrintPage(s, (unsigned long)v);
644 s.Add_UInt32((UInt32)(v >> 10));
645 s += "KB";
646 } 652 }
647 653
648 #if !defined(_AIX) 654 #if !defined(_AIX)
@@ -659,11 +665,11 @@ void AddCpuFeatures(AString &s)
659 const int pos = s2.Find('['); 665 const int pos = s2.Find('[');
660 if (pos >= 0) 666 if (pos >= 0)
661 { 667 {
662 const int pos2 = s2.Find(']', pos + 1); 668 const int pos2 = s2.Find(']', (unsigned)pos + 1);
663 if (pos2 >= 0) 669 if (pos2 >= 0)
664 { 670 {
665 s2.DeleteFrom(pos2); 671 s2.DeleteFrom((unsigned)pos2);
666 s2.DeleteFrontal(pos + 1); 672 s2.DeleteFrontal((unsigned)pos + 1);
667 } 673 }
668 } 674 }
669 s += s2; 675 s += s2;
@@ -722,10 +728,13 @@ EXTERN_C_END
722 728
723static BOOL My_RtlGetVersion(OSVERSIONINFOEXW *vi) 729static BOOL My_RtlGetVersion(OSVERSIONINFOEXW *vi)
724{ 730{
725 HMODULE ntdll = ::GetModuleHandleW(L"ntdll.dll"); 731 const HMODULE ntdll = ::GetModuleHandleW(L"ntdll.dll");
726 if (!ntdll) 732 if (!ntdll)
727 return FALSE; 733 return FALSE;
728 Func_RtlGetVersion func = (Func_RtlGetVersion)(void *)GetProcAddress(ntdll, "RtlGetVersion"); 734 const
735 Func_RtlGetVersion func = Z7_GET_PROC_ADDRESS(
736 Func_RtlGetVersion, ntdll,
737 "RtlGetVersion");
729 if (!func) 738 if (!func)
730 return FALSE; 739 return FALSE;
731 func(vi); 740 func(vi);
@@ -752,18 +761,18 @@ void GetOsInfoText(AString &sRes)
752 s += "Windows"; 761 s += "Windows";
753 if (vi.dwPlatformId != VER_PLATFORM_WIN32_NT) 762 if (vi.dwPlatformId != VER_PLATFORM_WIN32_NT)
754 s.Add_UInt32(vi.dwPlatformId); 763 s.Add_UInt32(vi.dwPlatformId);
755 s += " "; s.Add_UInt32(vi.dwMajorVersion); 764 s.Add_Space(); s.Add_UInt32(vi.dwMajorVersion);
756 s += "."; s.Add_UInt32(vi.dwMinorVersion); 765 s.Add_Dot(); s.Add_UInt32(vi.dwMinorVersion);
757 s += " "; s.Add_UInt32(vi.dwBuildNumber); 766 s.Add_Space(); s.Add_UInt32(vi.dwBuildNumber);
758 767
759 if (vi.wServicePackMajor != 0 || vi.wServicePackMinor != 0) 768 if (vi.wServicePackMajor != 0 || vi.wServicePackMinor != 0)
760 { 769 {
761 s += " SP:"; s.Add_UInt32(vi.wServicePackMajor); 770 s += " SP:"; s.Add_UInt32(vi.wServicePackMajor);
762 s += "."; s.Add_UInt32(vi.wServicePackMinor); 771 s.Add_Dot(); s.Add_UInt32(vi.wServicePackMinor);
763 } 772 }
764 // s += " Suite:"; PrintHex(s, vi.wSuiteMask); 773 // s += " Suite:"; PrintHex(s, vi.wSuiteMask);
765 // s += " Type:"; s.Add_UInt32(vi.wProductType); 774 // s += " Type:"; s.Add_UInt32(vi.wProductType);
766 // s += " "; s += GetOemString(vi.szCSDVersion); 775 // s.Add_Space(); s += GetOemString(vi.szCSDVersion);
767 } 776 }
768 /* 777 /*
769 { 778 {
@@ -793,6 +802,17 @@ void GetOsInfoText(AString &sRes)
793 #endif // _WIN32 802 #endif // _WIN32
794 803
795 sRes += s; 804 sRes += s;
805 #ifdef MY_CPU_X86_OR_AMD64
806 {
807 AString s2;
808 GetVirtCpuid(s2);
809 if (!s2.IsEmpty())
810 {
811 sRes += " : ";
812 sRes += s2;
813 }
814 }
815 #endif
796} 816}
797 817
798 818
@@ -875,6 +895,61 @@ void GetCpuName_MultiLine(AString &s)
875 } 895 }
876} 896}
877 897
898
899#ifdef MY_CPU_X86_OR_AMD64
900
901void GetVirtCpuid(AString &s)
902{
903 const UInt32 kHv = 0x40000000;
904
905 Z7_IF_X86_CPUID_SUPPORTED
906 {
907 UInt32 a[4];
908 z7_x86_cpuid(a, kHv);
909
910 if (a[0] < kHv || a[0] >= kHv + (1 << 16))
911 return;
912 {
913 {
914 for (unsigned j = 1; j < 4; j++)
915 PrintCpuChars(s, a[j]);
916 }
917 }
918 if (a[0] >= kHv + 1)
919 {
920 UInt32 d[4];
921 z7_x86_cpuid(d, kHv + 1);
922 s += " : ";
923 PrintCpuChars(s, d[0]);
924 if (a[0] >= kHv + 2)
925 {
926 z7_x86_cpuid(d, kHv + 2);
927 s += " : ";
928 s.Add_UInt32(d[1] >> 16);
929 s.Add_Dot(); s.Add_UInt32(d[1] & 0xffff);
930 s.Add_Dot(); s.Add_UInt32(d[0]);
931 s.Add_Dot(); s.Add_UInt32(d[2]);
932 s.Add_Dot(); s.Add_UInt32(d[3] >> 24);
933 s.Add_Dot(); s.Add_UInt32(d[3] & 0xffffff);
934 }
935 /*
936 if (a[0] >= kHv + 5)
937 {
938 z7_x86_cpuid(d, kHv + 5);
939 s += " : ";
940 s.Add_UInt32(d[0]);
941 s += "p";
942 s.Add_UInt32(d[1]);
943 s += "t";
944 }
945 */
946 }
947 }
948}
949
950#endif
951
952
878void GetCompiler(AString &s) 953void GetCompiler(AString &s)
879{ 954{
880 #ifdef __VERSION__ 955 #ifdef __VERSION__
@@ -884,28 +959,28 @@ void GetCompiler(AString &s)
884 #ifdef __GNUC__ 959 #ifdef __GNUC__
885 s += " GCC "; 960 s += " GCC ";
886 s.Add_UInt32(__GNUC__); 961 s.Add_UInt32(__GNUC__);
887 s += '.'; 962 s.Add_Dot();
888 s.Add_UInt32(__GNUC_MINOR__); 963 s.Add_UInt32(__GNUC_MINOR__);
889 s += '.'; 964 s.Add_Dot();
890 s.Add_UInt32(__GNUC_PATCHLEVEL__); 965 s.Add_UInt32(__GNUC_PATCHLEVEL__);
891 #endif 966 #endif
892 967
893 #ifdef __clang__ 968 #ifdef __clang__
894 s += " CLANG "; 969 s += " CLANG ";
895 s.Add_UInt32(__clang_major__); 970 s.Add_UInt32(__clang_major__);
896 s += '.'; 971 s.Add_Dot();
897 s.Add_UInt32(__clang_minor__); 972 s.Add_UInt32(__clang_minor__);
898 #endif 973 #endif
899 974
900 #ifdef __xlC__ 975 #ifdef __xlC__
901 s += " XLC "; 976 s += " XLC ";
902 s.Add_UInt32(__xlC__ >> 8); 977 s.Add_UInt32(__xlC__ >> 8);
903 s += '.'; 978 s.Add_Dot();
904 s.Add_UInt32(__xlC__ & 0xFF); 979 s.Add_UInt32(__xlC__ & 0xFF);
905 #ifdef __xlC_ver__ 980 #ifdef __xlC_ver__
906 s += '.'; 981 s.Add_Dot();
907 s.Add_UInt32(__xlC_ver__ >> 8); 982 s.Add_UInt32(__xlC_ver__ >> 8);
908 s += '.'; 983 s.Add_Dot();
909 s.Add_UInt32(__xlC_ver__ & 0xFF); 984 s.Add_UInt32(__xlC_ver__ & 0xFF);
910 #endif 985 #endif
911 #endif 986 #endif
@@ -914,4 +989,34 @@ void GetCompiler(AString &s)
914 s += " MSC "; 989 s += " MSC ";
915 s.Add_UInt32(_MSC_VER); 990 s.Add_UInt32(_MSC_VER);
916 #endif 991 #endif
992
993 #if defined(__AVX2__)
994 #define MY_CPU_COMPILE_ISA "AVX2"
995 #elif defined(__AVX__)
996 #define MY_CPU_COMPILE_ISA "AVX"
997 #elif defined(__SSE2__)
998 #define MY_CPU_COMPILE_ISA "SSE2"
999 #elif defined(_M_IX86_FP) && (_M_IX86_FP >= 2)
1000 #define MY_CPU_COMPILE_ISA "SSE2"
1001 #elif defined(__SSE__)
1002 #define MY_CPU_COMPILE_ISA "SSE"
1003 #elif defined(_M_IX86_FP) && (_M_IX86_FP >= 1)
1004 #define MY_CPU_COMPILE_ISA "SSE"
1005 #elif defined(__i686__)
1006 #define MY_CPU_COMPILE_ISA "i686"
1007 #elif defined(__i586__)
1008 #define MY_CPU_COMPILE_ISA "i586"
1009 #elif defined(__i486__)
1010 #define MY_CPU_COMPILE_ISA "i486"
1011 #elif defined(__i386__)
1012 #define MY_CPU_COMPILE_ISA "i386"
1013 #elif defined(_M_IX86_FP)
1014 #define MY_CPU_COMPILE_ISA "IA32"
1015 #endif
1016
1017
1018 #ifdef MY_CPU_COMPILE_ISA
1019 s += ':';
1020 s.Add_OptSpaced(MY_CPU_COMPILE_ISA);
1021 #endif
917} 1022}
diff --git a/CPP/Windows/SystemInfo.h b/CPP/Windows/SystemInfo.h
index e941d0a..c2e2e3b 100644
--- a/CPP/Windows/SystemInfo.h
+++ b/CPP/Windows/SystemInfo.h
@@ -1,7 +1,7 @@
1// Windows/SystemInfo.h 1// Windows/SystemInfo.h
2 2
3#ifndef __WINDOWS_SYSTEM_INFO_H 3#ifndef ZIP7_INC_WINDOWS_SYSTEM_INFO_H
4#define __WINDOWS_SYSTEM_INFO_H 4#define ZIP7_INC_WINDOWS_SYSTEM_INFO_H
5 5
6#include "../Common/MyString.h" 6#include "../Common/MyString.h"
7 7
@@ -14,5 +14,6 @@ void PrintSize_KMGT_Or_Hex(AString &s, UInt64 v);
14void Add_LargePages_String(AString &s); 14void Add_LargePages_String(AString &s);
15 15
16void GetCompiler(AString &s); 16void GetCompiler(AString &s);
17void GetVirtCpuid(AString &s);
17 18
18#endif 19#endif
diff --git a/CPP/Windows/Thread.h b/CPP/Windows/Thread.h
index 5fca173..d72f64c 100644
--- a/CPP/Windows/Thread.h
+++ b/CPP/Windows/Thread.h
@@ -1,7 +1,7 @@
1// Windows/Thread.h 1// Windows/Thread.h
2 2
3#ifndef __WINDOWS_THREAD_H 3#ifndef ZIP7_INC_WINDOWS_THREAD_H
4#define __WINDOWS_THREAD_H 4#define ZIP7_INC_WINDOWS_THREAD_H
5 5
6#include "../../C/Threads.h" 6#include "../../C/Threads.h"
7 7
@@ -13,7 +13,7 @@ class CThread MY_UNCOPYABLE
13{ 13{
14 ::CThread thread; 14 ::CThread thread;
15public: 15public:
16 CThread() { Thread_Construct(&thread); } 16 CThread() { Thread_CONSTRUCT(&thread) }
17 ~CThread() { Close(); } 17 ~CThread() { Close(); }
18 bool IsCreated() { return Thread_WasCreated(&thread) != 0; } 18 bool IsCreated() { return Thread_WasCreated(&thread) != 0; }
19 WRes Close() { return Thread_Close(&thread); } 19 WRes Close() { return Thread_Close(&thread); }
diff --git a/CPP/Windows/TimeUtils.cpp b/CPP/Windows/TimeUtils.cpp
index 77d2c51..e80ae13 100644
--- a/CPP/Windows/TimeUtils.cpp
+++ b/CPP/Windows/TimeUtils.cpp
@@ -258,7 +258,7 @@ void GetCurUtc_FiTime(CFiTime &ft) throw()
258 258
259 FiTime_Clear(ft); 259 FiTime_Clear(ft);
260 struct timeval now; 260 struct timeval now;
261 if (gettimeofday(&now, 0 ) == 0) 261 if (gettimeofday(&now, NULL) == 0)
262 { 262 {
263 ft.tv_sec = now.tv_sec; 263 ft.tv_sec = now.tv_sec;
264 ft.tv_nsec = now.tv_usec * 1000; 264 ft.tv_nsec = now.tv_usec * 1000;
@@ -272,7 +272,7 @@ void GetCurUtcFileTime(FILETIME &ft) throw()
272{ 272{
273 UInt64 v = 0; 273 UInt64 v = 0;
274 struct timeval now; 274 struct timeval now;
275 if (gettimeofday(&now, 0 ) == 0) 275 if (gettimeofday(&now, NULL) == 0)
276 { 276 {
277 v = ((UInt64)now.tv_sec + kUnixTimeOffset) * 277 v = ((UInt64)now.tv_sec + kUnixTimeOffset) *
278 kNumTimeQuantumsInSecond + (UInt64)now.tv_usec * 10; 278 kNumTimeQuantumsInSecond + (UInt64)now.tv_usec * 10;
diff --git a/CPP/Windows/TimeUtils.h b/CPP/Windows/TimeUtils.h
index 60ee739..4a9d0f2 100644
--- a/CPP/Windows/TimeUtils.h
+++ b/CPP/Windows/TimeUtils.h
@@ -1,7 +1,7 @@
1// Windows/TimeUtils.h 1// Windows/TimeUtils.h
2 2
3#ifndef __WINDOWS_TIME_UTILS_H 3#ifndef ZIP7_INC_WINDOWS_TIME_UTILS_H
4#define __WINDOWS_TIME_UTILS_H 4#define ZIP7_INC_WINDOWS_TIME_UTILS_H
5 5
6#include "../Common/MyTypes.h" 6#include "../Common/MyTypes.h"
7#include "../Common/MyWindows.h" 7#include "../Common/MyWindows.h"
diff --git a/CPP/Windows/Window.cpp b/CPP/Windows/Window.cpp
index 32af4aa..102c503 100644
--- a/CPP/Windows/Window.cpp
+++ b/CPP/Windows/Window.cpp
@@ -111,7 +111,7 @@ bool MySetWindowText(HWND wnd, LPCWSTR s)
111} 111}
112#endif 112#endif
113 113
114bool CWindow::GetText(CSysString &s) 114bool CWindow::GetText(CSysString &s) const
115{ 115{
116 s.Empty(); 116 s.Empty();
117 unsigned len = (unsigned)GetTextLength(); 117 unsigned len = (unsigned)GetTextLength();
@@ -119,7 +119,7 @@ bool CWindow::GetText(CSysString &s)
119 return (::GetLastError() == ERROR_SUCCESS); 119 return (::GetLastError() == ERROR_SUCCESS);
120 TCHAR *p = s.GetBuf(len); 120 TCHAR *p = s.GetBuf(len);
121 { 121 {
122 unsigned len2 = (unsigned)GetText(p, (int)(len + 1)); 122 const unsigned len2 = (unsigned)GetText(p, (int)(len + 1));
123 if (len > len2) 123 if (len > len2)
124 len = len2; 124 len = len2;
125 } 125 }
@@ -130,7 +130,7 @@ bool CWindow::GetText(CSysString &s)
130} 130}
131 131
132#ifndef _UNICODE 132#ifndef _UNICODE
133bool CWindow::GetText(UString &s) 133bool CWindow::GetText(UString &s) const
134{ 134{
135 if (g_IsNT) 135 if (g_IsNT)
136 { 136 {
@@ -140,7 +140,7 @@ bool CWindow::GetText(UString &s)
140 return (::GetLastError() == ERROR_SUCCESS); 140 return (::GetLastError() == ERROR_SUCCESS);
141 wchar_t *p = s.GetBuf(len); 141 wchar_t *p = s.GetBuf(len);
142 { 142 {
143 unsigned len2 = (unsigned)GetWindowTextW(_window, p, (int)(len + 1)); 143 const unsigned len2 = (unsigned)GetWindowTextW(_window, p, (int)(len + 1));
144 if (len > len2) 144 if (len > len2)
145 len = len2; 145 len = len2;
146 } 146 }
@@ -150,7 +150,7 @@ bool CWindow::GetText(UString &s)
150 return true; 150 return true;
151 } 151 }
152 CSysString sysString; 152 CSysString sysString;
153 bool result = GetText(sysString); 153 const bool result = GetText(sysString);
154 MultiByteToUnicodeString2(s, sysString); 154 MultiByteToUnicodeString2(s, sysString);
155 return result; 155 return result;
156} 156}
diff --git a/CPP/Windows/Window.h b/CPP/Windows/Window.h
index 83726c7..a99143b 100644
--- a/CPP/Windows/Window.h
+++ b/CPP/Windows/Window.h
@@ -1,7 +1,7 @@
1// Windows/Window.h 1// Windows/Window.h
2 2
3#ifndef __WINDOWS_WINDOW_H 3#ifndef ZIP7_INC_WINDOWS_WINDOW_H
4#define __WINDOWS_WINDOW_H 4#define ZIP7_INC_WINDOWS_WINDOW_H
5 5
6#include "../Common/MyWindows.h" 6#include "../Common/MyWindows.h"
7#include "../Common/MyString.h" 7#include "../Common/MyString.h"
@@ -9,23 +9,100 @@
9#include "Defs.h" 9#include "Defs.h"
10 10
11#ifndef UNDER_CE 11#ifndef UNDER_CE
12#ifdef WM_CHANGEUISTATE
13#define Z7_WIN_WM_CHANGEUISTATE WM_CHANGEUISTATE
14#define Z7_WIN_WM_UPDATEUISTATE WM_UPDATEUISTATE
15#define Z7_WIN_WM_QUERYUISTATE WM_QUERYUISTATE
16#else
17// these are defined for (_WIN32_WINNT >= 0x0500):
18#define Z7_WIN_WM_CHANGEUISTATE 0x0127
19#define Z7_WIN_WM_UPDATEUISTATE 0x0128
20#define Z7_WIN_WM_QUERYUISTATE 0x0129
21#endif
22
23#ifdef UIS_SET
12 24
13#define MY__WM_CHANGEUISTATE 0x0127 25#define Z7_WIN_UIS_SET UIS_SET
14#define MY__WM_UPDATEUISTATE 0x0128 26#define Z7_WIN_UIS_CLEAR UIS_CLEAR
15#define MY__WM_QUERYUISTATE 0x0129 27#define Z7_WIN_UIS_INITIALIZE UIS_INITIALIZE
16 28
29#define Z7_WIN_UISF_HIDEFOCUS UISF_HIDEFOCUS
30#define Z7_WIN_UISF_HIDEACCEL UISF_HIDEACCEL
31
32#else
33// these are defined for (_WIN32_WINNT >= 0x0500):
17// LOWORD(wParam) values in WM_*UISTATE 34// LOWORD(wParam) values in WM_*UISTATE
18#define MY__UIS_SET 1 35#define Z7_WIN_UIS_SET 1
19#define MY__UIS_CLEAR 2 36#define Z7_WIN_UIS_CLEAR 2
20#define MY__UIS_INITIALIZE 3 37#define Z7_WIN_UIS_INITIALIZE 3
21 38
22// HIWORD(wParam) values in WM_*UISTATE 39// HIWORD(wParam) values in WM_*UISTATE
23#define MY__UISF_HIDEFOCUS 0x1 40#define Z7_WIN_UISF_HIDEFOCUS 0x1
24#define MY__UISF_HIDEACCEL 0x2 41#define Z7_WIN_UISF_HIDEACCEL 0x2
25#define MY__UISF_ACTIVE 0x4 42// defined for for (_WIN32_WINNT >= 0x0501):
43// #define Z7_WIN_UISF_ACTIVE 0x4
26 44
27#endif 45#endif
28 46
47#endif // UNDER_CE
48
49
50#ifdef Z7_OLD_WIN_SDK
51
52// #define VK_OEM_1 0xBA // ';:' for US
53#define VK_OEM_PLUS 0xBB // '+' any country
54// #define VK_OEM_COMMA 0xBC // ',' any country
55#define VK_OEM_MINUS 0xBD // '-' any country
56// #define VK_OEM_PERIOD 0xBE // '.' any country
57// #define VK_OEM_2 0xBF // '/?' for US
58// #define VK_OEM_3 0xC0 // '`~' for US
59
60// #ifndef GWLP_USERDATA
61#define GWLP_WNDPROC (-4)
62#define GWLP_USERDATA (-21)
63// #endif
64#define DWLP_MSGRESULT 0
65// #define DWLP_DLGPROC DWLP_MSGRESULT + sizeof(LRESULT)
66// #define DWLP_USER DWLP_DLGPROC + sizeof(DLGPROC)
67
68#define BTNS_BUTTON TBSTYLE_BUTTON // 0x0000
69
70/*
71vc6 defines INT_PTR via long:
72 typedef long INT_PTR, *PINT_PTR;
73 typedef unsigned long UINT_PTR, *PUINT_PTR;
74but newer sdk (sdk2003+) defines INT_PTR via int:
75 typedef _W64 int INT_PTR, *PINT_PTR;
76 typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
77*/
78
79#define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0)
80
81#define GetWindowLongPtrA GetWindowLongA
82#define GetWindowLongPtrW GetWindowLongW
83#ifdef UNICODE
84#define GetWindowLongPtr GetWindowLongPtrW
85#else
86#define GetWindowLongPtr GetWindowLongPtrA
87#endif // !UNICODE
88
89#define SetWindowLongPtrA SetWindowLongA
90#define SetWindowLongPtrW SetWindowLongW
91#ifdef UNICODE
92#define SetWindowLongPtr SetWindowLongPtrW
93#else
94#define SetWindowLongPtr SetWindowLongPtrA
95#endif // !UNICODE
96
97#define ListView_SetCheckState(hwndLV, i, fCheck) \
98 ListView_SetItemState(hwndLV, i, INDEXTOSTATEIMAGEMASK((fCheck)?2:1), LVIS_STATEIMAGEMASK)
99
100#endif // Z7_OLD_WIN_SDK
101
102inline bool LRESULTToBool(LRESULT v) { return (v != FALSE); }
103
104#define MY_int_TO_WPARAM(i) ((WPARAM)(INT_PTR)(i))
105
29namespace NWindows { 106namespace NWindows {
30 107
31inline ATOM MyRegisterClass(CONST WNDCLASS *wndClass) 108inline ATOM MyRegisterClass(CONST WNDCLASS *wndClass)
@@ -52,12 +129,13 @@ bool MySetWindowText(HWND wnd, LPCWSTR s);
52 129
53class CWindow 130class CWindow
54{ 131{
132 Z7_CLASS_NO_COPY(CWindow)
55private: 133private:
56 // bool ModifyStyleBase(int styleOffset, DWORD remove, DWORD add, UINT flags); 134 // bool ModifyStyleBase(int styleOffset, DWORD remove, DWORD add, UINT flags);
57protected: 135protected:
58 HWND _window; 136 HWND _window;
59public: 137public:
60 CWindow(HWND newWindow = NULL): _window(newWindow){}; 138 CWindow(HWND newWindow = NULL): _window(newWindow) {}
61 CWindow& operator=(HWND newWindow) 139 CWindow& operator=(HWND newWindow)
62 { 140 {
63 _window = newWindow; 141 _window = newWindow;
@@ -174,6 +252,7 @@ public:
174 void SetRedraw(bool redraw = true) { SendMsg(WM_SETREDRAW, (WPARAM)BoolToBOOL(redraw), 0); } 252 void SetRedraw(bool redraw = true) { SendMsg(WM_SETREDRAW, (WPARAM)BoolToBOOL(redraw), 0); }
175 253
176 LONG_PTR SetStyle(LONG_PTR style) { return SetLongPtr(GWL_STYLE, style); } 254 LONG_PTR SetStyle(LONG_PTR style) { return SetLongPtr(GWL_STYLE, style); }
255 // LONG_PTR SetStyle(DWORD style) { return SetLongPtr(GWL_STYLE, (LONG_PTR)style); }
177 LONG_PTR GetStyle() const { return GetLongPtr(GWL_STYLE); } 256 LONG_PTR GetStyle() const { return GetLongPtr(GWL_STYLE); }
178 // bool MyIsMaximized() const { return ((GetStyle() & WS_MAXIMIZE) != 0); } 257 // bool MyIsMaximized() const { return ((GetStyle() & WS_MAXIMIZE) != 0); }
179 258
@@ -246,19 +325,19 @@ public:
246 { return GetWindowTextLength(_window); } 325 { return GetWindowTextLength(_window); }
247 int GetText(LPTSTR string, int maxCount) const 326 int GetText(LPTSTR string, int maxCount) const
248 { return GetWindowText(_window, string, maxCount); } 327 { return GetWindowText(_window, string, maxCount); }
249 bool GetText(CSysString &s); 328 bool GetText(CSysString &s) const;
250 #ifndef _UNICODE 329 #ifndef _UNICODE
251 /* 330 /*
252 UINT GetText(LPWSTR string, int maxCount) const 331 UINT GetText(LPWSTR string, int maxCount) const
253 { return GetWindowTextW(_window, string, maxCount); } 332 { return GetWindowTextW(_window, string, maxCount); }
254 */ 333 */
255 bool GetText(UString &s); 334 bool GetText(UString &s) const;
256 #endif 335 #endif
257 336
258 bool Enable(bool enable) 337 bool Enable(bool enable)
259 { return BOOLToBool(::EnableWindow(_window, BoolToBOOL(enable))); } 338 { return BOOLToBool(::EnableWindow(_window, BoolToBOOL(enable))); }
260 339
261 bool IsEnabled() 340 bool IsEnabled() const
262 { return BOOLToBool(::IsWindowEnabled(_window)); } 341 { return BOOLToBool(::IsWindowEnabled(_window)); }
263 342
264 #ifndef UNDER_CE 343 #ifndef UNDER_CE
@@ -266,7 +345,7 @@ public:
266 { return ::GetSystemMenu(_window, BoolToBOOL(revert)); } 345 { return ::GetSystemMenu(_window, BoolToBOOL(revert)); }
267 #endif 346 #endif
268 347
269 UINT_PTR SetTimer(UINT_PTR idEvent, UINT elapse, TIMERPROC timerFunc = 0) 348 UINT_PTR SetTimer(UINT_PTR idEvent, UINT elapse, TIMERPROC timerFunc = NULL)
270 { return ::SetTimer(_window, idEvent, elapse, timerFunc); } 349 { return ::SetTimer(_window, idEvent, elapse, timerFunc); }
271 bool KillTimer(UINT_PTR idEvent) 350 bool KillTimer(UINT_PTR idEvent)
272 {return BOOLToBool(::KillTimer(_window, idEvent)); } 351 {return BOOLToBool(::KillTimer(_window, idEvent)); }