diff src/w32fns.c @ 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 04fafc2fc785
children 87b807b2d9b1 0ece58f6e0aa a66921565bcb
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);