Chromium Code Reviews| 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 |