]> git.eshelyaron.com Git - emacs.git/commitdiff
(w32_msg_pump) <WM_EMACS_CREATEWINDOW>: Initialize COM.
authorJason Rumney <jasonr@gnu.org>
Wed, 11 Jul 2007 14:43:07 +0000 (14:43 +0000)
committerJason Rumney <jasonr@gnu.org>
Wed, 11 Jul 2007 14:43:07 +0000 (14:43 +0000)
(w32_msg_pump) <WM_DESTROY>: Uninitialize COM.

src/ChangeLog
src/w32fns.c

index 190d6fb0e3622f504412fbd88f8e4c1952cbf3f6..d112f7297bf0d1732d2375d2367a2e2fcdb71067 100644 (file)
@@ -1,3 +1,10 @@
+2007-07-11  Jason Rumney  <jasonr@gnu.org>
+
+       * makefile.w32-in (LIBS): Include OLE32.
+
+       * w32fns.c (w32_msg_pump) <WM_EMACS_CREATEWINDOW>: Initialize COM.
+       (w32_msg_pump) <WM_DESTROY>: Uninitialize COM.
+
 2007-06-28  YAMAMOTO Mitsuharu  <mituharu@math.s.chiba-u.ac.jp>
 
        * macterm.c [USE_MAC_TSM] (mac_handle_text_input_event):
index fd8df29affa75a0708878962a9917057fecfc20d..47ca9157623bfaae7a37a14ab8f90980577c1b8d 100644 (file)
@@ -52,6 +52,7 @@ Boston, MA 02110-1301, USA.  */
 #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 @@ w32_msg_pump (deferred_msg * msg_buf)
              /* 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 @@ w32_wnd_proc (hwnd, msg, wParam, lParam)
       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);