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 |