#pragma implementation "dynlib.h"
#endif
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+ #pragma hdrstop
+#endif //__BORLANDC__
+
+#ifndef WX_PRECOMP
+#endif //WX_PRECOMP
+
#include <wx/dynlib.h>
#include <wx/filefn.h>
#include <wx/list.h>
// System dependent include
// ---------------------------------------------------------------------------
-#ifdef __UNIX__
+#if defined(__UNIX__)
#include <dlfcn.h>
#endif
#include <windows.h>
#endif
+#ifdef LoadLibrary
+#undef LoadLibrary
+#endif
+
// ---------------------------------------------------------------------------
// Global variables
// ---------------------------------------------------------------------------
wxLibrary::wxLibrary(void *handle)
{
- typedef wxClassInfo **(*t_get_first)(void);
+ typedef wxClassInfo *(*t_get_first)(void);
t_get_first get_first;
m_handle = handle;
wxLibrary::~wxLibrary()
{
if (m_handle && m_destroy) {
-#ifdef __UNIX__
+#if defined(__UNIX__)
dlclose(m_handle);
#endif
#ifdef __WINDOWS__
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;
}
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";
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
lib = new wxLibrary((void *)handle);
+ wxClassInfo::sm_first = old_sm_first;
+
m_loaded.Append(name.GetData(), lib);
return lib;
}
while (node) {
obj = ((wxLibrary *)node->Data())->CreateObject(path);
- if (obj)
+ if (obj)
return obj;
node = node->Next();