X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f4a8c29f7a3ffa7eb60d9b7f055565eb2df368d9..8bbe427f8e5a2078b266e282453595b5a634d35c:/src/common/dynlib.cpp?ds=inline diff --git a/src/common/dynlib.cpp b/src/common/dynlib.cpp index 6384eb3a8b..91f3c16577 100644 --- a/src/common/dynlib.cpp +++ b/src/common/dynlib.cpp @@ -13,6 +13,15 @@ #pragma implementation "dynlib.h" #endif +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif //__BORLANDC__ + +#ifndef WX_PRECOMP +#endif //WX_PRECOMP + #include #include #include @@ -22,7 +31,7 @@ // System dependent include // --------------------------------------------------------------------------- -#ifdef __UNIX__ +#if defined(__UNIX__) #include #endif @@ -30,6 +39,10 @@ #include #endif +#ifdef LoadLibrary +#undef LoadLibrary +#endif + // --------------------------------------------------------------------------- // Global variables // --------------------------------------------------------------------------- @@ -42,7 +55,7 @@ wxLibraries wxTheLibraries; wxLibrary::wxLibrary(void *handle) { - typedef wxClassInfo **(*t_get_first)(void); + typedef wxClassInfo *(*t_get_first)(void); t_get_first get_first; m_handle = handle; @@ -58,7 +71,7 @@ wxLibrary::wxLibrary(void *handle) wxLibrary::~wxLibrary() { if (m_handle && m_destroy) { -#ifdef __UNIX__ +#if defined(__UNIX__) dlclose(m_handle); #endif #ifdef __WINDOWS__ @@ -77,37 +90,36 @@ wxObject *wxLibrary::CreateObject(const wxString& name) return info->CreateObject(); } -void wxLibrary::PrepareClasses(wxClassInfo **first) +void wxLibrary::PrepareClasses(wxClassInfo *first) { // Index all class infos by their class name - wxClassInfo *info = *first; + wxClassInfo *info = first; while (info) { - if (info->className) - classTable.Put(info->className, (wxObject *)info); - info = info->next; + if (info->m_className) + classTable.Put(info->m_className, (wxObject *)info); + info = info->GetNext(); } // Set base pointers for each wxClassInfo - info = *first; + info = first; while (info) { if (info->GetBaseClassName1()) - info->baseInfo1 = (wxClassInfo *)classTable.Get(info->GetBaseClassName1()); + info->m_baseInfo1 = (wxClassInfo *)classTable.Get(info->GetBaseClassName1()); if (info->GetBaseClassName2()) - info->baseInfo2 = (wxClassInfo *)classTable.Get(info->GetBaseClassName2()); - info = info->next; + info->m_baseInfo2 = (wxClassInfo *)classTable.Get(info->GetBaseClassName2()); + info = info->m_next; } - *first = NULL; } void *wxLibrary::GetSymbol(const wxString& symbname) { -#ifdef __UNIX__ +#if defined(__UNIX__) return dlsym(m_handle, WXSTRINGCAST symbname); #endif #ifdef __WINDOWS__ - return GetProcAddress(m_handle, WXSTRINGCAST symbname); + return GetProcAddress((HINSTANCE) m_handle, WXSTRINGCAST symbname); #endif return NULL; } @@ -137,10 +149,15 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name) wxString lib_name = name; wxNode *node; wxLibrary *lib; + wxClassInfo *old_sm_first; if ( (node = m_loaded.Find(name.GetData())) ) return ((wxLibrary *)node->Data()); + // If DLL shares data, this is necessary. + old_sm_first = wxClassInfo::sm_first; + wxClassInfo::sm_first = NULL; + #if defined(__UNIX__) lib_name.Prepend("./lib"); lib_name += ".so"; @@ -149,12 +166,18 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name) void *handle = dlopen(WXSTRINGCAST lib_name, RTLD_LAZY); + printf("error = %s\n", dlerror()); + if (!handle) return NULL; #elif defined(__WINDOWS__) lib_name += ".dll"; - HMODULE handle = LoadLibrary(lib_name); +#ifdef UNICODE + HMODULE handle = LoadLibraryW(lib_name); +#else + HMODULE handle = LoadLibraryA(lib_name); +#endif if (!handle) return NULL; #else @@ -163,6 +186,8 @@ wxLibrary *wxLibraries::LoadLibrary(const wxString& name) lib = new wxLibrary((void *)handle); + wxClassInfo::sm_first = old_sm_first; + m_loaded.Append(name.GetData(), lib); return lib; } @@ -174,7 +199,7 @@ wxObject *wxLibraries::CreateObject(const wxString& path) while (node) { obj = ((wxLibrary *)node->Data())->CreateObject(path); - if (obj) + if (obj) return obj; node = node->Next();