Chromium Code Reviews| Index: base/win/wrapped_window_proc.h |
| =================================================================== |
| --- base/win/wrapped_window_proc.h (revision 0) |
| +++ base/win/wrapped_window_proc.h (revision 0) |
| @@ -0,0 +1,66 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +// Provides a way to handle exceptions that happen while a WindowProc is |
| +// running. The behavior of exceptions generated inside a WindowProc is OS |
| +// dependent, but it is possible that the OS just ignores the exception and |
| +// continues execution, which leads to unpredictable behavior for Chrome. |
| + |
| +#ifndef BASE_WIN_WRAPPED_WINDOW_PROC_H_ |
| +#define BASE_WIN_WRAPPED_WINDOW_PROC_H_ |
| +#pragma once |
| + |
| +#include <windows.h> |
| + |
| +namespace base { |
| +namespace win { |
| + |
| +// An exception filter for a WindowProc. The return value determines how the |
| +// exception should be handled, following standard SEH rules. However, the |
| +// expected behavior for this function is to not return, instead of returning |
| +// EXCEPTION_EXECUTE_HANDLER or similar, given that in general we are not |
| +// prepared to handle exceptions. |
| +typedef int (__cdecl *WinProcExceptionFilter)(EXCEPTION_POINTERS* info); |
| + |
| +// Sets the filter to deal with exceptions inside a WindowProc. Returns the old |
| +// exception filter, if any. |
| +// This function should be called before any window is created. |
| +WinProcExceptionFilter SetWinProcExceptionFilter(WinProcExceptionFilter filter); |
| + |
| +// Calls the registered exception filter. |
| +int CallExceptionFilter(EXCEPTION_POINTERS* info); |
| + |
| +// Wrapper that supplies a standard exception frame for the provided WindowProc. |
| +// The normal usage is something like this: |
| +// |
| +// LRESULT CALLBACK MyWinProc(HWND hwnd, UINT message, |
| +// WPARAM wparam, LPARAM lparam) { |
| +// // Do Something. |
| +// } |
| +// |
| +// ... |
| +// |
| +// WNDCLASSEX wc = {0}; |
| +// wc.lpfnWndProc = WrappedWindowProc<MyWinProc>; |
| +// wc.lpszClassName = class_name; |
| +// ... |
| +// RegisterClassEx(&wc); |
| +// |
| +// CreateWindowW(class_name, window_name, ... |
| +// |
| +template <WNDPROC proc> |
|
cpu_(ooo_6.6-7.5)
2011/03/16 00:12:37
it feels that we could do
template <WNDPROC proc,
rvargas (doing something else)
2011/03/16 00:25:07
The idea is that the filter is not provided by the
|
| +LRESULT CALLBACK WrappedWindowProc(HWND hwnd, UINT message, |
| + WPARAM wparam, LPARAM lparam) { |
| + LRESULT rv = 0; |
| + __try { |
| + rv = proc(hwnd, message, wparam, lparam); |
| + } __except(CallExceptionFilter(GetExceptionInformation())) { |
| + } |
| + return rv; |
| +} |
| + |
| +} // namespace win |
| +} // namespace base |
| + |
| +#endif // BASE_WIN_WRAPPED_WINDOW_PROC_H_ |
| Property changes on: base\win\wrapped_window_proc.h |
| ___________________________________________________________________ |
| Added: svn:eol-style |
| + LF |