DO NOT REPLY TO THIS MESSAGE.  INSTEAD, POST ANY RESPONSES TO THE LINK BELOW.

[STR New]

Link: http://www.fltk.org/str.php?L2417
Version: 1.3.0





Link: http://www.fltk.org/str.php?L2417
Version: 1.3.0
Index: src/Fl_win32.cxx
===================================================================
--- src/Fl_win32.cxx    (Revision 7704)
+++ src/Fl_win32.cxx    (Arbeitskopie)
@@ -1554,14 +1554,10 @@
   // Drag-n-drop requires GCC 3.x or a non-GNU compiler...
 #if !defined(__GNUC__) || __GNUC__ >= 3
   // Register all windows for potential drag'n'drop operations
-  static char oleInitialized = 0;
-  if (!oleInitialized) { OleInitialize(0L); oleInitialized=1; }
-
+  fl_OleInitialize();
   RegisterDragDrop(x->xid, flIDropTarget);
+
   if (!fl_aimm) {
-    static char been_here = 0;
-    if (!been_here && !oleInitialized) CoInitialize(NULL);
-    been_here = 1;
     CoCreateInstance(CLSID_CActiveIMM, NULL, CLSCTX_INPROC_SERVER,
                     IID_IActiveIMMApp, (void**) &fl_aimm);
     if (fl_aimm) {
Index: src/Fl.cxx
===================================================================
--- src/Fl.cxx  (Revision 7704)
+++ src/Fl.cxx  (Arbeitskopie)
@@ -484,13 +484,35 @@
 }
 
 #ifdef WIN32
+
+// Function to initialize COM/OLE for usage. This must be done only once.
+// We define a flag to register whether we called it:
+static char oleInitialized = 0;
+
+// This calls the Windows function OleInitialize() exactly once.
+void fl_OleInitialize() {
+  if (!oleInitialized) {
+    OleInitialize(0L);
+    oleInitialized = 1;
+  }
+}
+
+// This calls the Windows function OleUninitialize() only, if
+// OleInitialize has been called before.
+void fl_OleUninitialize() {
+  if (oleInitialized) {
+    OleUninitialize();
+    oleInitialized = 0;
+  }
+}
+
 class Fl_Win32_At_Exit {
 public:
   Fl_Win32_At_Exit() { }
   ~Fl_Win32_At_Exit() {
     fl_free_fonts();        // do some WIN32 cleanup
     fl_cleanup_pens();
-    OleUninitialize();
+    fl_OleUninitialize();
     fl_brush_action(1);
     fl_cleanup_dc_list();
   }
Index: src/Fl_Native_File_Chooser_WIN32.cxx
===================================================================
--- src/Fl_Native_File_Chooser_WIN32.cxx        (Revision 7704)
+++ src/Fl_Native_File_Chooser_WIN32.cxx        (Arbeitskopie)
@@ -47,6 +47,8 @@
 #define RBRACKET_CHR   ']'
 #define MAXFILTERS     80
 
+void fl_OleInitialize();       // in Fl.cxx (Windows only)
+
 // STATIC: PRINT WINDOWS 'DOUBLE NULL' STRING (DEBUG)
 static void dnullprint(char *wp) {
   if ( ! wp ) return;
@@ -464,7 +466,8 @@
 
 // SHOW DIRECTORY BROWSER
 int Fl_Native_File_Chooser::showdir() {
-  OleInitialize(NULL);         // init needed by BIF_USENEWUI
+  // initialize OLE only once
+  fl_OleInitialize();          // init needed by BIF_USENEWUI
   ClearBINF();
   clear_pathnames();
   // PARENT WINDOW
_______________________________________________
fltk-bugs mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk-bugs

Reply via email to