X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/27529614c292a298e67dd8db1f169c94a4df204c..520e470fdd0daef09c77938db642e4583933c90d:/src/common/dynlib.cpp diff --git a/src/common/dynlib.cpp b/src/common/dynlib.cpp index 9c5a777109..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 @@ -46,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; @@ -62,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__ @@ -81,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; } @@ -141,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"; @@ -153,6 +166,8 @@ 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__) @@ -171,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; } @@ -182,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();