| Index: src/plugin/PluginClass.cpp | 
| =================================================================== | 
| --- a/src/plugin/PluginClass.cpp | 
| +++ b/src/plugin/PluginClass.cpp | 
| @@ -40,6 +40,9 @@ | 
| extern CComModule _Module; | 
| +// Status bar pane number | 
| +#define STATUSBAR_PANE_NUMBER 2 | 
| + | 
| typedef HANDLE (WINAPI *OPENTHEMEDATA)(HWND, LPCWSTR); | 
| typedef HRESULT (WINAPI *DRAWTHEMEBACKGROUND)(HANDLE, HDC, INT, INT, LPRECT, LPRECT); | 
| typedef HRESULT (WINAPI *CLOSETHEMEDATA)(HANDLE); | 
| @@ -55,7 +58,6 @@ | 
| DRAWTHEMEBACKGROUND pfnDrawThemeBackground = NULL; | 
| OPENTHEMEDATA pfnOpenThemeData = NULL; | 
| -ATOM CPluginClass::s_atomPaneClass = NULL; | 
| HINSTANCE CPluginClass::s_hUxtheme = NULL; | 
| std::set<CPluginClass*> CPluginClass::s_instances; | 
| @@ -700,37 +702,6 @@ | 
| } | 
| s_criticalSectionLocal.Unlock(); | 
| - // Register pane class | 
| - if (!GetAtomPaneClass()) | 
| - { | 
| - WNDCLASSEX wcex; | 
| - | 
| - wcex.cbSize = sizeof(wcex); | 
| - wcex.style = 0; | 
| - wcex.lpfnWndProc = (WNDPROC)PaneWindowProc; | 
| - wcex.cbClsExtra = 0; | 
| - wcex.cbWndExtra = 0; | 
| - wcex.hInstance = _Module.m_hInst; | 
| - wcex.hIcon = NULL; | 
| - wcex.hCursor = NULL; | 
| - wcex.hbrBackground = NULL; | 
| - wcex.lpszMenuName = NULL; | 
| - wcex.lpszClassName = STATUSBAR_PANE_NAME; | 
| - wcex.hIconSm = NULL; | 
| - | 
| - s_criticalSectionLocal.Lock(); | 
| - { | 
| - s_atomPaneClass = ::RegisterClassEx(&wcex); | 
| - } | 
| - s_criticalSectionLocal.Unlock(); | 
| - | 
| - if (!GetAtomPaneClass()) | 
| - { | 
| - DEBUG_ERROR_LOG(::GetLastError(), PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_REGISTER_PANE_CLASS, "Class::InitObject - RegisterClassEx"); | 
| - return false; | 
| - } | 
| - } | 
| - | 
| int ieVersion = AdblockPlus::IE::InstalledMajorVersion(); | 
| // Create status pane | 
| if (ieVersion > 6 && !CreateStatusBarPane()) | 
| @@ -776,6 +747,25 @@ | 
| return true; | 
| } | 
| +namespace | 
| +{ | 
| + /** | 
| + * Wrapper for Windows API 'SetWindowLongPtr()' to set a new window procedure | 
| + * | 
| + * Adds type safety and proper error handling over calling the API function directly. | 
| + */ | 
| + DWORD SetWindowProc(HWND window, WNDPROC procedure) | 
| + { | 
| + /* | 
| + * Error handling for 'SetWindowLongPtr()' is not standard. | 
| + * The method below is as specified by its documentation. | 
| + */ | 
| + SetLastError(0); | 
| + ::SetWindowLongPtr(window, GWLP_WNDPROC, reinterpret_cast<LONG_PTR>(procedure)); | 
| + return ::GetLastError(); | 
| + } | 
| +} | 
| + | 
| bool CPluginClass::CreateStatusBarPane() | 
| { | 
| CriticalSection::Lock lock(m_csStatusBar); | 
| @@ -902,8 +892,8 @@ | 
| // Create pane window | 
| HWND hWndNewPane = ::CreateWindowEx( | 
| NULL, | 
| - MAKEINTATOM(GetAtomPaneClass()), | 
| - L"", | 
| + L"Edit", // predefined system class | 
| + L"ABPStatusBarPane", | 
| WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, | 
| rcStatusBar.Width() - 500, 0, m_nPaneWidth, rcStatusBar.Height(), | 
| hWndStatusBar, | 
| @@ -917,6 +907,15 @@ | 
| return false; | 
| } | 
| + // Set window procedure to the one for status bars | 
| + auto error = SetWindowProc(hWndNewPane, CPluginClass::PaneWindowProc); | 
| + if (error) | 
| + { | 
| + DEBUG_ERROR_LOG(error, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_CREATE_STATUSBAR_PANE, "Class::SetStatusBarPaneWindowProc - SetWindowProc"); | 
| + ::DestroyWindow(hWndNewPane); | 
| + return false; | 
| + } | 
| + | 
| DEBUG_GENERAL("ABP window created"); | 
| m_hTabWnd = hTabWnd; | 
| m_hStatusBarWnd = hWndStatusBar; | 
| @@ -1069,8 +1068,8 @@ | 
| // Create menu parent window | 
| HWND hMenuWnd = ::CreateWindowEx( | 
| NULL, | 
| - MAKEINTATOM(GetAtomPaneClass()), | 
| - L"", | 
| + L"Edit", // predefined system class | 
| + L"ABPStatusBarPopupMenu", | 
| 0, | 
| 0,0,0,0, | 
| NULL, | 
| @@ -1084,6 +1083,15 @@ | 
| return; | 
| } | 
| + // Set window procedure to the one for status bars. | 
| + auto error = SetWindowProc(hMenuWnd, CPluginClass::PaneWindowProc); | 
| + if (error) | 
| + { | 
| + DEBUG_ERROR_LOG(error, PLUGIN_ERROR_UI, PLUGIN_ERROR_UI_CREATE_STATUSBAR_PANE, "Class::DisplayPluginMenu - SetWindowProc"); | 
| + ::DestroyWindow(hMenuWnd); | 
| + return; | 
| + } | 
| + | 
| // Display menu | 
| nMenuFlags |= TPM_NONOTIFY | TPM_RETURNCMD | TPM_LEFTBUTTON; | 
| @@ -1729,9 +1737,3 @@ | 
| return icon; | 
| } | 
| - | 
| -ATOM CPluginClass::GetAtomPaneClass() | 
| -{ | 
| - return s_atomPaneClass; | 
| -} | 
| - |