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