diff options
author | hbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-12 03:18:31 +0000 |
---|---|---|
committer | hbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-12 03:18:31 +0000 |
commit | fcf0272855583c84d6695865e12c7006e2c40467 (patch) | |
tree | 85d92b260c7435b1de197b8048413bfcc34974a7 | |
parent | 5d15ca3b908891e9a9d514448510651484c1c207 (diff) | |
download | chromium_src-fcf0272855583c84d6695865e12c7006e2c40467.zip chromium_src-fcf0272855583c84d6695865e12c7006e2c40467.tar.gz chromium_src-fcf0272855583c84d6695865e12c7006e2c40467.tar.bz2 |
An experimental fix for Issue 11046.
This change replaces some ImmAssociateContextEx() calls with a LoadLibrary() call and a GetProcAddress() call to prevent Chrome from loading "imm32.dll" on a PC which doesn't have valid "imm32.dll" installed. (Since I have not been able to reproduce this issue on my XP box, this is just a blind fix.)
BUG=11046 "repeated crash on launch"
Review URL: http://codereview.chromium.org/113096
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@15832 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | base/win_util.cc | 20 | ||||
-rw-r--r-- | base/win_util.h | 6 | ||||
-rw-r--r-- | views/controls/table/table_view.cc | 2 | ||||
-rw-r--r-- | views/controls/tree/tree_view.cc | 2 | ||||
-rw-r--r-- | views/widget/widget_win.cc | 2 |
5 files changed, 29 insertions, 3 deletions
diff --git a/base/win_util.cc b/base/win_util.cc index 2f1ceb9..b71ac30 100644 --- a/base/win_util.cc +++ b/base/win_util.cc @@ -436,6 +436,26 @@ void NotifyHWNDDestruction(const tracked_objects::Location& from_here, from_here)); } +bool IMEAttach(HWND window, bool attach) { + // To prevent a crash when calling ImmAssociateContextEx() function on a PC + // which has a valid "imm32.dll" installed, we manually load "imm32.dll" and + // call its "ImmAssociateContextEx() function. + bool result = false; + HMODULE imm32_module = LoadLibrary(L"imm32.dll"); + if (imm32_module) { + typedef BOOL (WINAPI* Imm32_ImmAssociateContextEx)(HWND, HIMC, DWORD); + Imm32_ImmAssociateContextEx imm_associate_context_ex = + reinterpret_cast<Imm32_ImmAssociateContextEx>( + GetProcAddress(imm32_module, "ImmAssociateContextEx")); + if (imm_associate_context_ex) { + result = !!imm_associate_context_ex(window, NULL, + attach ? IACE_DEFAULT : 0); + } + FreeLibrary(imm32_module); + } + return result; +} + } // namespace win_util #ifdef _MSC_VER diff --git a/base/win_util.h b/base/win_util.h index 284b9bd..b801e56 100644 --- a/base/win_util.h +++ b/base/win_util.h @@ -117,6 +117,12 @@ void NotifyHWNDDestruction(const tracked_objects::Location& from_here, #define TRACK_HWND_DESTRUCTION(hwnd) \ win_util::NotifyHWNDDestruction(FROM_HERE, hwnd) +// Attach the default IME to the window or detach it from the window. +// This functions is a wrapper function for the ImmAssociateContextEx() +// function to prevent a crash when calling the function on a PC which doesn't +// have a valid "imm32.dll" installed. +bool IMEAttach(HWND window, bool attach); + } // namespace win_util #endif // BASE_WIN_UTIL_H__ diff --git a/views/controls/table/table_view.cc b/views/controls/table/table_view.cc index 434b355..bde6bec 100644 --- a/views/controls/table/table_view.cc +++ b/views/controls/table/table_view.cc @@ -892,7 +892,7 @@ HWND TableView::CreateNativeControl(HWND parent_container) { // Bug 964884: detach the IME attached to this window. // We should attach IMEs only when we need to input CJK strings. - ::ImmAssociateContextEx(list_view_, NULL, 0); + win_util::IMEAttach(list_view_, false); UpdateContentOffset(); diff --git a/views/controls/tree/tree_view.cc b/views/controls/tree/tree_view.cc index 08f2255..894aa6e 100644 --- a/views/controls/tree/tree_view.cc +++ b/views/controls/tree/tree_view.cc @@ -358,7 +358,7 @@ HWND TreeView::CreateNativeControl(HWND parent_container) { // Bug 964884: detach the IME attached to this window. // We should attach IMEs only when we need to input CJK strings. - ::ImmAssociateContextEx(tree_view_, NULL, 0); + win_util::IMEAttach(tree_view_, false); return tree_view_; } diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc index b092682..4a4e27e 100644 --- a/views/widget/widget_win.cc +++ b/views/widget/widget_win.cc @@ -219,7 +219,7 @@ void WidgetWin::Init(HWND parent, const gfx::Rect& bounds, // Bug 964884: detach the IME attached to this window. // We should attach IMEs only when we need to input CJK strings. - ::ImmAssociateContextEx(GetNativeView(), NULL, 0); + win_util::IMEAttach(GetNativeView(), false); } void WidgetWin::SetContentsView(View* view) { |