diff options
| author | Albrecht Schlosser <albrechts.fltk@online.de> | 2010-09-27 14:57:53 +0000 |
|---|---|---|
| committer | Albrecht Schlosser <albrechts.fltk@online.de> | 2010-09-27 14:57:53 +0000 |
| commit | b010bce1af756d007d194eba16202dd9dcba80c7 (patch) | |
| tree | 6f9ca34d3fbf08a1147b314c85e1194618216358 /src | |
| parent | 5c968a2589f3a32a01d17db0130ead4e778fbd80 (diff) | |
Fixed unbalanced Windows OleInitialize/OleUnitialize calls
when loading/unloading the FLTK dll (STR #2417)
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7706 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src')
| -rw-r--r-- | src/Fl.cxx | 24 | ||||
| -rw-r--r-- | src/Fl_Native_File_Chooser_WIN32.cxx | 5 | ||||
| -rw-r--r-- | src/Fl_win32.cxx | 8 |
3 files changed, 29 insertions, 8 deletions
diff --git a/src/Fl.cxx b/src/Fl.cxx index bc8abb928..55dedea96 100644 --- a/src/Fl.cxx +++ b/src/Fl.cxx @@ -484,13 +484,35 @@ int Fl::run() { } #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(); } diff --git a/src/Fl_Native_File_Chooser_WIN32.cxx b/src/Fl_Native_File_Chooser_WIN32.cxx index 063c1e532..750a36d66 100644 --- a/src/Fl_Native_File_Chooser_WIN32.cxx +++ b/src/Fl_Native_File_Chooser_WIN32.cxx @@ -47,6 +47,8 @@ char *wchartoutf8(LPCWSTR in); //MG #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 @@ int CALLBACK Fl_Native_File_Chooser::Dir_CB(HWND win, UINT msg, LPARAM param, LP // 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 diff --git a/src/Fl_win32.cxx b/src/Fl_win32.cxx index af04135d7..53f65eebb 100644 --- a/src/Fl_win32.cxx +++ b/src/Fl_win32.cxx @@ -1554,14 +1554,10 @@ Fl_X* Fl_X::make(Fl_Window* w) { // 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) { |
