Home | History | Annotate | Download | only in win
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // Provides a way to handle exceptions that happen while a WindowProc is
      6 // running. The behavior of exceptions generated inside a WindowProc is OS
      7 // dependent, but it is possible that the OS just ignores the exception and
      8 // continues execution, which leads to unpredictable behavior for Chrome.
      9 
     10 #ifndef BASE_WIN_WRAPPED_WINDOW_PROC_H_
     11 #define BASE_WIN_WRAPPED_WINDOW_PROC_H_
     12 #pragma once
     13 
     14 #include <windows.h>
     15 
     16 #include "base/base_api.h"
     17 
     18 namespace base {
     19 namespace win {
     20 
     21 // An exception filter for a WindowProc. The return value determines how the
     22 // exception should be handled, following standard SEH rules. However, the
     23 // expected behavior for this function is to not return, instead of returning
     24 // EXCEPTION_EXECUTE_HANDLER or similar, given that in general we are not
     25 // prepared to handle exceptions.
     26 typedef int (__cdecl *WinProcExceptionFilter)(EXCEPTION_POINTERS* info);
     27 
     28 // Sets the filter to deal with exceptions inside a WindowProc. Returns the old
     29 // exception filter, if any.
     30 // This function should be called before any window is created.
     31 BASE_API WinProcExceptionFilter SetWinProcExceptionFilter(
     32     WinProcExceptionFilter filter);
     33 
     34 // Calls the registered exception filter.
     35 BASE_API int CallExceptionFilter(EXCEPTION_POINTERS* info);
     36 
     37 // Wrapper that supplies a standard exception frame for the provided WindowProc.
     38 // The normal usage is something like this:
     39 //
     40 // LRESULT CALLBACK MyWinProc(HWND hwnd, UINT message,
     41 //                            WPARAM wparam, LPARAM lparam) {
     42 //   // Do Something.
     43 // }
     44 //
     45 // ...
     46 //
     47 //   WNDCLASSEX wc = {0};
     48 //   wc.lpfnWndProc = WrappedWindowProc<MyWinProc>;
     49 //   wc.lpszClassName = class_name;
     50 //   ...
     51 //   RegisterClassEx(&wc);
     52 //
     53 //   CreateWindowW(class_name, window_name, ...
     54 //
     55 template <WNDPROC proc>
     56 LRESULT CALLBACK WrappedWindowProc(HWND hwnd, UINT message,
     57                                    WPARAM wparam, LPARAM lparam) {
     58   LRESULT rv = 0;
     59   __try {
     60     rv = proc(hwnd, message, wparam, lparam);
     61   } __except(CallExceptionFilter(GetExceptionInformation())) {
     62   }
     63   return rv;
     64 }
     65 
     66 }  // namespace win
     67 }  // namespace base
     68 
     69 #endif  // BASE_WIN_WRAPPED_WINDOW_PROC_H_
     70