summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-12 03:18:31 +0000
committerhbono@chromium.org <hbono@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-12 03:18:31 +0000
commitfcf0272855583c84d6695865e12c7006e2c40467 (patch)
tree85d92b260c7435b1de197b8048413bfcc34974a7
parent5d15ca3b908891e9a9d514448510651484c1c207 (diff)
downloadchromium_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.cc20
-rw-r--r--base/win_util.h6
-rw-r--r--views/controls/table/table_view.cc2
-rw-r--r--views/controls/tree/tree_view.cc2
-rw-r--r--views/widget/widget_win.cc2
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) {