Mercurial > emacs
changeset 78106:f9eb7f243bdc
(w32_msg_pump) <WM_EMACS_CREATEWINDOW>: Initialize COM.
(w32_msg_pump) <WM_DESTROY>: Uninitialize COM.
author | Jason Rumney <jasonr@gnu.org> |
---|---|
date | Wed, 11 Jul 2007 14:42:21 +0000 |
parents | 1f50b1fcfba3 |
children | 30346382d01b |
files | src/w32fns.c |
diffstat | 1 files changed, 12 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/w32fns.c Wed Jul 11 14:41:44 2007 +0000 +++ b/src/w32fns.c Wed Jul 11 14:42:21 2007 +0000 @@ -52,6 +52,7 @@ #include <shellapi.h> #include <ctype.h> #include <winspool.h> +#include <objbase.h> #include <dlgs.h> #define FILE_NAME_TEXT_FIELD edt1 @@ -2514,6 +2515,13 @@ /* Produced by complete_deferred_msg; just ignore. */ break; case WM_EMACS_CREATEWINDOW: + /* Initialize COM for this window. Even though we don't use it, + some third party shell extensions can cause it to be used in + system dialogs, which causes a crash if it is not initialized. + This is a known bug in Windows, which was fixed long ago, but + the patch for XP is not publically available until XP SP3, + and older versions will never be patched. */ + CoInitialize (NULL); w32_createwindow ((struct frame *) msg.wParam); if (!PostThreadMessage (dwMainThreadId, WM_EMACS_DONE, 0, 0)) abort (); @@ -3660,6 +3668,10 @@ my_post_msg (&wmsg, hwnd, msg, wParam, lParam); goto dflt; + case WM_DESTROY: + CoUninitialize (); + return 0; + case WM_CLOSE: wmsg.dwModifiers = w32_get_modifiers (); my_post_msg (&wmsg, hwnd, msg, wParam, lParam);