// headers
// ----------------------------------------------------------------------------
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
# pragma implementation "dynlib.h"
#endif
#if wxUSE_DYNLIB_CLASS
#if defined(__WINDOWS__)
- #include "wx/msw/private.h"
+ #include "wx/msw/wrapwin.h"
#endif
#include "wx/dynlib.h"
#include "wx/log.h"
#include "wx/utils.h"
#include "wx/filename.h" // for SplitPath()
+#include "wx/app.h"
+#include "wx/apptrait.h"
#if defined(__WXMAC__)
#include "wx/mac/private.h"
unsigned int index;
static char *OFIErrorStrings[] =
{
- "%s(%d): Object Image Load Failure\n",
- "%s(%d): Object Image Load Success\n",
- "%s(%d): Not an recognisable object file\n",
- "%s(%d): No valid architecture\n",
- "%s(%d): Object image has an invalid format\n",
- "%s(%d): Invalid access (permissions?)\n",
- "%s(%d): Unknown error code from NSCreateObjectFileImageFromFile\n",
+ "%s(%d): Object Image Load Failure\n",
+ "%s(%d): Object Image Load Success\n",
+ "%s(%d): Not an recognisable object file\n",
+ "%s(%d): No valid architecture\n",
+ "%s(%d): Object image has an invalid format\n",
+ "%s(%d): Invalid access (permissions?)\n",
+ "%s(%d): Unknown error code from NSCreateObjectFileImageFromFile\n",
};
#define NUM_OFI_ERRORS (sizeof(OFIErrorStrings) / sizeof(OFIErrorStrings[0]))
dyld_result = NSCreateObjectFileImageFromFile(path, &ofile);
if (dyld_result != NSObjectFileImageSuccess)
{
- TranslateError(path, dyld_result);
+ TranslateError(path, dyld_result);
}
else
{
- // NSLinkModule will cause the run to abort on any link error's
- // not very friendly but the error recovery functionality is limited.
- handle = NSLinkModule(ofile, path, NSLINKMODULE_OPTION_BINDNOW);
+ // NSLinkModule will cause the run to abort on any link error's
+ // not very friendly but the error recovery functionality is limited.
+ handle = NSLinkModule(ofile, path, NSLINKMODULE_OPTION_BINDNOW);
}
return handle;
void *dlsym(void *handle, const char *symbol)
{
void *addr;
-
+
NSSymbol nsSymbol = NSLookupSymbolInModule( handle , symbol ) ;
- if ( nsSymbol)
+ if ( nsSymbol)
{
- addr = NSAddressOfSymbol(nsSymbol);
+ addr = NSAddressOfSymbol(nsSymbol);
}
- else
+ else
{
- addr = NULL;
+ addr = NULL;
}
return addr;
}
#if defined(__WINDOWS__) || defined(__WXPM__) || defined(__EMX__)
const wxChar *wxDynamicLibrary::ms_dllext = _T(".dll");
+#elif defined(__WXMAC__) && !defined(__DARWIN__)
+ const wxChar *wxDynamicLibrary::ms_dllext = _T("");
#elif defined(__UNIX__)
#if defined(__HPUX__)
const wxChar *wxDynamicLibrary::ms_dllext = _T(".sl");
+ #elif defined(__DARWIN__)
+ const wxChar *wxDynamicLibrary::ms_dllext = _T(".dylib");
#else
const wxChar *wxDynamicLibrary::ms_dllext = _T(".so");
#endif
&myMainAddr,
myErrName ) != noErr )
{
- p2cstr( myErrName );
wxLogSysError( _("Failed to load shared library '%s' Error '%s'"),
libname.c_str(),
- (char*)myErrName );
+ wxMacMakeStringFromPascal( myErrName ).c_str() );
m_handle = 0;
}
#elif defined(HAVE_DLOPEN) || defined(__DARWIN__)
#if defined(__VMS) || defined(__DARWIN__)
- m_handle = dlopen(libname.c_str(), 0); // The second parameter is ignored
+ m_handle = dlopen(libname.fn_str(), 0); // The second parameter is ignored
#else // !__VMS && !__DARWIN__
int rtldFlags = 0;
return IsLoaded();
}
-void wxDynamicLibrary::Unload()
+/* static */
+void wxDynamicLibrary::Unload(wxDllType handle)
{
- if( IsLoaded() )
- {
#if defined(__WXPM__) || defined(__EMX__)
- DosFreeModule( m_handle );
+ DosFreeModule( handle );
#elif defined(HAVE_DLOPEN) || defined(__DARWIN__)
- dlclose( m_handle );
+ dlclose( handle );
#elif defined(HAVE_SHL_LOAD)
- shl_unload( m_handle );
+ shl_unload( handle );
#elif defined(__WINDOWS__)
- ::FreeLibrary( m_handle );
+ ::FreeLibrary( handle );
#elif defined(__WXMAC__) && !defined(__DARWIN__)
- CloseConnection( (CFragConnectionID*) &m_handle );
+ CloseConnection( (CFragConnectionID*) &handle );
#else
-#error "runtime shared lib support not implemented"
+ #error "runtime shared lib support not implemented"
#endif
- m_handle = 0;
- }
}
void *wxDynamicLibrary::GetSymbol(const wxString &name, bool *success) const
bool failed = FALSE;
void *symbol = 0;
+ wxUnusedVar(symbol);
#if defined(__WXMAC__) && !defined(__DARWIN__)
Ptr symAddress;
CFragSymbolClass symClass;
Str255 symName;
#if TARGET_CARBON
- c2pstrcpy( (StringPtr) symName, name );
+ c2pstrcpy( (StringPtr) symName, name.fn_str() );
#else
- strcpy( (char *)symName, name );
+ strcpy( (char *)symName, name.fn_str() );
c2pstr( (char *)symName );
#endif
- if( FindSymbol( dllHandle, symName, &symAddress, &symClass ) == noErr )
+ if( FindSymbol( m_handle, symName, &symAddress, &symClass ) == noErr )
symbol = (void *)symAddress;
#elif defined(__WXPM__) || defined(__EMX__)
symbol = 0;
#elif defined(__WINDOWS__)
+#ifdef __WXWINCE__
+ symbol = (void*) ::GetProcAddress( m_handle, name );
+#else
symbol = (void*) ::GetProcAddress( m_handle, name.mb_str() );
+#endif
#else
#error "runtime shared lib support not implemented"
return symbol;
}
-
+
/*static*/
-wxString wxDynamicLibrary::CanonicalizeName(const wxString& name,
- wxDynamicLibraryCategory cat)
+wxString
+wxDynamicLibrary::CanonicalizeName(const wxString& name,
+ wxDynamicLibraryCategory
+#ifdef __UNIX__
+ cat
+#else // !__UNIX__
+ WXUNUSED(cat)
+#endif // __UNIX__/!__UNIX__
+ )
{
+ wxString nameCanonic;
+
+ // under Unix the library names usually start with "lib" prefix, add it
#ifdef __UNIX__
- if ( cat == wxDL_MODULE )
- return name + GetDllExt();
- else
- return wxString(_T("lib")) + name + GetDllExt();
-#else
- return name + GetDllExt();
-#endif
+ switch ( cat )
+ {
+ default:
+ wxFAIL_MSG( _T("unknown wxDynamicLibraryCategory value") );
+ // fall through
+
+ case wxDL_MODULE:
+ // don't do anything for modules, their names are arbitrary
+ break;
+
+ case wxDL_LIBRARY:
+ // library names should start with "lib" under Unix
+ nameCanonic = _T("lib");
+ break;
+ }
+#endif // __UNIX__
+
+ nameCanonic << name << GetDllExt();
+ return nameCanonic;
}
/*static*/
wxString suffix;
if ( cat == wxDL_PLUGIN_GUI )
{
- suffix = wxString::FromAscii(
-#if defined(__WXMSW__)
- "msw"
-#elif defined(__WXGTK__)
- "gtk"
-#elif defined(__WXMGL__)
- "mgl"
-#elif defined(__WXMOTIF__)
- "motif"
-#elif defined(__WXOS2__)
- "pm"
-#elif defined(__WXX11__)
- "x11"
-#elif defined(__WXMAC__)
- "mac"
-#elif defined(__WXCOCOA__)
- "cocoa"
-#else // FIXME - wrong!
- ""
-#endif
- );
-
-#ifdef __WXUNIVERSAL__
- suffix << _T("univ");
-#endif
+ wxAppTraits *traits = wxAppConsole::GetInstance() ?
+ wxAppConsole::GetInstance()->GetTraits() : NULL;
+ wxASSERT_MSG( traits,
+ _("can't query for GUI plugins name in console applications") );
+ suffix = traits->GetToolkitInfo().shortName;
}
#if wxUSE_UNICODE
suffix << _T('u');
if ( !suffix.empty() )
suffix = wxString(_T("_")) + suffix;
+#define WXSTRINGIZE(x) #x
#ifdef __UNIX__
#if (wxMINOR_VERSION % 2) == 0
- #define wxDLLVER(x,y,z) "-" #x "." #y
+ #define wxDLLVER(x,y,z) "-" WXSTRINGIZE(x) "." WXSTRINGIZE(y)
#else
- #define wxDLLVER(x,y,z) "-" #x "." #y "." #z
+ #define wxDLLVER(x,y,z) "-" WXSTRINGIZE(x) "." WXSTRINGIZE(y) "." WXSTRINGIZE(z)
#endif
#else
#if (wxMINOR_VERSION % 2) == 0
- #define wxDLLVER(x,y,z) #x #y
+ #define wxDLLVER(x,y,z) WXSTRINGIZE(x) WXSTRINGIZE(y)
#else
- #define wxDLLVER(x,y,z) #x #y #z
+ #define wxDLLVER(x,y,z) WXSTRINGIZE(x) WXSTRINGIZE(y) WXSTRINGIZE(z)
#endif
#endif
+
suffix << wxString::FromAscii(wxDLLVER(wxMAJOR_VERSION, wxMINOR_VERSION,
wxRELEASE_NUMBER));
#undef wxDLLVER
+#undef WXSTRINGIZE
+
+#ifdef __WINDOWS__
+ // Add compiler identification:
+ #if defined(__GNUG__)
+ suffix << _T("_gcc");
+ #elif defined(__VISUALC__)
+ suffix << _T("_vc");
+ #elif defined(__WATCOMC__)
+ suffix << _T("_wat");
+ #elif defined(__BORLANDC__)
+ suffix << _T("_bcc");
+ #endif
+#endif
return CanonicalizeName(name + suffix, wxDL_MODULE);
}
-
+
/*static*/
wxString wxDynamicLibrary::GetPluginsDirectory()
{
#ifdef __UNIX__
wxString format = wxGetInstallPrefix();
+ wxString dir;
format << wxFILE_SEP_PATH
<< wxT("lib") << wxFILE_SEP_PATH
<< wxT("wx") << wxFILE_SEP_PATH
+#if (wxMINOR_VERSION % 2) == 0
<< wxT("%i.%i");
- wxString dir;
dir.Printf(format.c_str(), wxMAJOR_VERSION, wxMINOR_VERSION);
- return dir;
#else
+ << wxT("%i.%i.%i");
+ dir.Printf(format.c_str(),
+ wxMAJOR_VERSION, wxMINOR_VERSION, wxRELEASE_NUMBER);
+#endif
+ return dir;
+
+#else // ! __UNIX__
return wxEmptyString;
#endif
}