annotate foosdk/sdk/foobar2000/helpers/win32_misc.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include <libPPUI/win32_op.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #include <libPPUI/win32_utility.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 class mutexScope {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 mutexScope(HANDLE hMutex_, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 ~mutexScope();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 PFC_CLASS_NOT_COPYABLE_EX(mutexScope);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 HANDLE hMutex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #ifdef FOOBAR2000_DESKTOP_WINDOWS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 class registerclass_scope_delayed {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 registerclass_scope_delayed() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 bool is_registered() const {return m_class != 0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 void toggle_on(UINT p_style,WNDPROC p_wndproc,int p_clsextra,int p_wndextra,HICON p_icon,HCURSOR p_cursor,HBRUSH p_background,const TCHAR * p_classname,const TCHAR * p_menuname);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 void toggle_off();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 ATOM get_class() const {return m_class;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 ~registerclass_scope_delayed() {toggle_off();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 registerclass_scope_delayed(const registerclass_scope_delayed &) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 const registerclass_scope_delayed & operator=(const registerclass_scope_delayed &) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 ATOM m_class = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 typedef CGlobalLockScope CGlobalLock; // compatibility
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 class OleInitializeScope {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 OleInitializeScope();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 ~OleInitializeScope();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 PFC_CLASS_NOT_COPYABLE_EX(OleInitializeScope);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 class CoInitializeScope {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 CoInitializeScope();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 CoInitializeScope(DWORD params);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 ~CoInitializeScope();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 PFC_CLASS_NOT_COPYABLE_EX(CoInitializeScope)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 WORD GetOSVersion();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 #if _WIN32_WINNT >= 0x501
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 #define WS_EX_COMPOSITED_Safe() WS_EX_COMPOSITED
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 static DWORD WS_EX_COMPOSITED_Safe() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 return (GetOSVersion() < 0x501) ? 0 : 0x02000000L;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 class CModelessDialogEntry {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 CModelessDialogEntry() : m_wnd() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 CModelessDialogEntry(HWND p_wnd) : m_wnd() {Set(p_wnd);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 ~CModelessDialogEntry() {Set(NULL);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 void Set(HWND p_new);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 PFC_CLASS_NOT_COPYABLE_EX(CModelessDialogEntry);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 HWND m_wnd;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 class CDLL {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 static LPTOP_LEVEL_EXCEPTION_FILTER _GetEH() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 LPTOP_LEVEL_EXCEPTION_FILTER rv = SetUnhandledExceptionFilter(NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 SetUnhandledExceptionFilter(rv);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 return rv;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 CDLL(const wchar_t * Name) : hMod() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 Load(Name);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 CDLL() : hMod() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 void Load(const wchar_t * Name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 PFC_ASSERT( hMod == NULL );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 auto handlerBefore = _GetEH();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 WIN32_OP( hMod = LoadLibrary(Name) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 #ifdef _DEBUG
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 PFC_ASSERT( handlerBefore == _GetEH() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 ~CDLL() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 if (hMod) FreeLibrary(hMod);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 template<typename funcptr_t> void Bind(funcptr_t & outFunc, const char * name) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 WIN32_OP( outFunc = (funcptr_t)GetProcAddress(hMod, name) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 HMODULE hMod;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 PFC_CLASS_NOT_COPYABLE_EX(CDLL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 class winLocalFileScope {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 void open(const char * inPath, file::ptr inReader, abort_callback & aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 void close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 winLocalFileScope() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 winLocalFileScope(const char * inPath, file::ptr inReader, abort_callback & aborter) : m_isTemp() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 open(inPath, inReader, aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 ~winLocalFileScope() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 close();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 const wchar_t * Path() const { return m_path.c_str(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 bool isTemp() const { return m_isTemp; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 bool m_isTemp = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 std::wstring m_path;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 #endif // FOOBAR2000_DESKTOP_WINDOWS
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 class CMutex {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 CMutex(const TCHAR * name = NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 ~CMutex();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 HANDLE Handle() {return m_hMutex;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 static void AcquireByHandle( HANDLE hMutex, abort_callback & aborter );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 void Acquire( abort_callback& aborter );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 void Release();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 CMutex(const CMutex&) = delete; void operator=(const CMutex&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 HANDLE m_hMutex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 class CMutexScope {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 CMutexScope(CMutex & mutex, DWORD timeOutMS, const char * timeOutBugMsg);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 CMutexScope(CMutex & mutex);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 CMutexScope(CMutex & mutex, abort_callback & aborter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 ~CMutexScope();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 CMutexScope(const CMutexScope &) = delete; void operator=(const CMutexScope&) = delete;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 CMutex & m_mutex;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 bool IsWindowsS();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 class OleInitializeScope {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 class CoInitializeScope {};
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 #endif // _WIN32