aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2014-04-25 10:23:16 +1000
committerNeil <nyamatongwe@gmail.com>2014-04-25 10:23:16 +1000
commit8265cfedef23121375966cfd6f22975330580f11 (patch)
tree180e1c3bc6fb2ff72d53233d335489139cef019f
parent842ed275e902c0d9eaca950860e3b15cf6aca9cc (diff)
downloadscintilla-mirror-8265cfedef23121375966cfd6f22975330580f11.tar.gz
Free system libraries at finalization.
-rw-r--r--win32/PlatWin.cxx24
-rw-r--r--win32/ScintillaWin.cxx9
2 files changed, 29 insertions, 4 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index 53b889896..315af73db 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -103,6 +103,9 @@ ID2D1Factory *pD2DFactory = 0;
IDWriteRenderingParams *defaultRenderingParams = 0;
IDWriteRenderingParams *customClearTypeRenderingParams = 0;
+static HMODULE hDLLD2D = NULL;
+static HMODULE hDLLDWrite = NULL;
+
bool LoadD2D() {
static bool triedLoadingD2D = false;
if (!triedLoadingD2D) {
@@ -111,7 +114,7 @@ bool LoadD2D() {
typedef HRESULT (WINAPI *DWriteCFSig)(DWRITE_FACTORY_TYPE factoryType, REFIID iid,
IUnknown **factory);
- HMODULE hDLLD2D = ::LoadLibraryEx(TEXT("D2D1.DLL"), 0, 0x00000800 /*LOAD_LIBRARY_SEARCH_SYSTEM32*/);
+ hDLLD2D = ::LoadLibraryEx(TEXT("D2D1.DLL"), 0, 0x00000800 /*LOAD_LIBRARY_SEARCH_SYSTEM32*/);
if (hDLLD2D) {
D2D1CFSig fnD2DCF = (D2D1CFSig)::GetProcAddress(hDLLD2D, "D2D1CreateFactory");
if (fnD2DCF) {
@@ -122,7 +125,7 @@ bool LoadD2D() {
reinterpret_cast<IUnknown**>(&pD2DFactory));
}
}
- HMODULE hDLLDWrite = ::LoadLibraryEx(TEXT("DWRITE.DLL"), 0, 0x00000800 /*LOAD_LIBRARY_SEARCH_SYSTEM32*/);
+ hDLLDWrite = ::LoadLibraryEx(TEXT("DWRITE.DLL"), 0, 0x00000800 /*LOAD_LIBRARY_SEARCH_SYSTEM32*/);
if (hDLLDWrite) {
DWriteCFSig fnDWCF = (DWriteCFSig)::GetProcAddress(hDLLDWrite, "DWriteCreateFactory");
if (fnDWCF) {
@@ -3266,12 +3269,27 @@ void Platform_Finalise() {
pD2DFactory->Release();
pD2DFactory = 0;
}
-
+ if (hDLLDWrite) {
+ FreeLibrary(hDLLDWrite);
+ hDLLDWrite = NULL;
+ }
+ if (hDLLD2D) {
+ FreeLibrary(hDLLD2D);
+ hDLLD2D = NULL;
+ }
#endif
if (reverseArrowCursor != NULL)
::DestroyCursor(reverseArrowCursor);
ListBoxX_Unregister();
::DeleteCriticalSection(&crPlatformLock);
+ if (hDLLUser32) {
+ FreeLibrary(hDLLUser32);
+ hDLLUser32 = NULL;
+ }
+ if (hDLLImage) {
+ FreeLibrary(hDLLImage);
+ hDLLImage = NULL;
+ }
}
#ifdef SCI_NAMESPACE
diff --git a/win32/ScintillaWin.cxx b/win32/ScintillaWin.cxx
index 0e2308c70..a0372f574 100644
--- a/win32/ScintillaWin.cxx
+++ b/win32/ScintillaWin.cxx
@@ -125,6 +125,8 @@ class ScintillaWin; // Forward declaration for COM interface subobjects
typedef void VFunction(void);
+static HMODULE commctrl32 = 0;
+
/**
*/
class FormatEnumerator {
@@ -383,7 +385,8 @@ void ScintillaWin::Initialise() {
TrackMouseEventFn = (TrackMouseEventSig)::GetProcAddress(user32, "TrackMouseEvent");
if (TrackMouseEventFn == NULL) {
// Windows 95 has an emulation in comctl32.dll:_TrackMouseEvent
- HMODULE commctrl32 = ::LoadLibrary(TEXT("comctl32.dll"));
+ if (!commctrl32)
+ commctrl32 = ::LoadLibrary(TEXT("comctl32.dll"));
if (commctrl32 != NULL) {
TrackMouseEventFn = (TrackMouseEventSig)
::GetProcAddress(commctrl32, "_TrackMouseEvent");
@@ -2872,6 +2875,10 @@ int Scintilla_RegisterClasses(void *hInstance) {
// This function is externally visible so it can be called from container when building statically.
int Scintilla_ReleaseResources() {
bool result = ScintillaWin::Unregister();
+ if (commctrl32) {
+ FreeLibrary(commctrl32);
+ commctrl32 = NULL;
+ }
Platform_Finalise();
return result;
}