OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/win/wrapped_window_proc.h" | 5 #include "base/win/wrapped_window_proc.h" |
6 | 6 |
7 #include "base/atomicops.h" | 7 #include "base/atomicops.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/process/memory.h" | |
10 | 9 |
11 namespace { | 10 namespace { |
12 | 11 |
13 base::win::WinProcExceptionFilter s_exception_filter = NULL; | 12 base::win::WinProcExceptionFilter s_exception_filter = NULL; |
14 | 13 |
14 HMODULE GetModuleFromWndProc(WNDPROC window_proc) { | |
15 HMODULE instance = NULL; | |
16 // Converting a pointer-to-function to a void* is undefined behavior, but | |
17 // Windows (and POSIX) APIs require it to work. | |
18 void* address = reinterpret_cast<void*>(window_proc); | |
19 if (!::GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | | |
20 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, | |
21 static_cast<char*>(address), | |
Will Harris
2016/04/04 01:26:44
why double cast, why not just reinterpret_cast<> s
Nico
2016/04/04 01:38:47
Yes. I had this inline here, but it looked cramped
| |
22 &instance)) { | |
23 NOTREACHED(); | |
24 } | |
25 return instance; | |
26 } | |
27 | |
15 } // namespace. | 28 } // namespace. |
16 | 29 |
17 namespace base { | 30 namespace base { |
18 namespace win { | 31 namespace win { |
19 | 32 |
20 WinProcExceptionFilter SetWinProcExceptionFilter( | 33 WinProcExceptionFilter SetWinProcExceptionFilter( |
21 WinProcExceptionFilter filter) { | 34 WinProcExceptionFilter filter) { |
22 subtle::AtomicWord rv = subtle::NoBarrier_AtomicExchange( | 35 subtle::AtomicWord rv = subtle::NoBarrier_AtomicExchange( |
23 reinterpret_cast<subtle::AtomicWord*>(&s_exception_filter), | 36 reinterpret_cast<subtle::AtomicWord*>(&s_exception_filter), |
24 reinterpret_cast<subtle::AtomicWord>(filter)); | 37 reinterpret_cast<subtle::AtomicWord>(filter)); |
(...skipping 15 matching lines...) Expand all Loading... | |
40 HBRUSH background, | 53 HBRUSH background, |
41 const char16* menu_name, | 54 const char16* menu_name, |
42 HICON large_icon, | 55 HICON large_icon, |
43 HICON small_icon, | 56 HICON small_icon, |
44 WNDCLASSEX* class_out) { | 57 WNDCLASSEX* class_out) { |
45 class_out->cbSize = sizeof(WNDCLASSEX); | 58 class_out->cbSize = sizeof(WNDCLASSEX); |
46 class_out->style = style; | 59 class_out->style = style; |
47 class_out->lpfnWndProc = window_proc; | 60 class_out->lpfnWndProc = window_proc; |
48 class_out->cbClsExtra = class_extra; | 61 class_out->cbClsExtra = class_extra; |
49 class_out->cbWndExtra = window_extra; | 62 class_out->cbWndExtra = window_extra; |
50 class_out->hInstance = base::GetModuleFromAddress(window_proc); | 63 // RegisterClassEx uses a handle of the module containing the window procedure |
64 // to distinguish identically named classes registered in different modules. | |
65 class_out->hInstance = GetModuleFromWndProc(window_proc); | |
51 class_out->hIcon = large_icon; | 66 class_out->hIcon = large_icon; |
52 class_out->hCursor = cursor; | 67 class_out->hCursor = cursor; |
53 class_out->hbrBackground = background; | 68 class_out->hbrBackground = background; |
54 class_out->lpszMenuName = menu_name; | 69 class_out->lpszMenuName = menu_name; |
55 class_out->lpszClassName = class_name; | 70 class_out->lpszClassName = class_name; |
56 class_out->hIconSm = small_icon; | 71 class_out->hIconSm = small_icon; |
57 | 72 |
58 // Check if |window_proc| is valid. | 73 // Check if |window_proc| is valid. |
59 DCHECK(class_out->hInstance != NULL); | 74 DCHECK(class_out->hInstance != NULL); |
60 } | 75 } |
61 | 76 |
62 } // namespace win | 77 } // namespace win |
63 } // namespace base | 78 } // namespace base |
OLD | NEW |