From: Vadim Zeitlin Date: Fri, 21 Sep 2007 18:43:51 +0000 (+0000) Subject: added more convenient wxDL_INIT_FUNC[_AW] macros and use them instead of verbose... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/d0edb9da6028587c8c17158172a95dcdb2de96f5 added more convenient wxDL_INIT_FUNC[_AW] macros and use them instead of verbose wxDynamicLibrary::GetSymbol() calls git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48891 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dynlib.h b/include/wx/dynlib.h index 88e58a7c73..6f842edb17 100644 --- a/include/wx/dynlib.h +++ b/include/wx/dynlib.h @@ -106,6 +106,24 @@ enum wxPluginCategory type pfn ## name = (type)(dynlib).GetSymbol(_T(#name)) +// a more convenient function replacing wxDYNLIB_FUNCTION above +// +// it uses the convention that the type of the function is its name suffixed +// with "_t" but it doesn't define a variable but just assigns the loaded value +// to it and also allows to pass it the prefix to be used instead of hardcoding +// "pfn" (the prefix can be "m_" or "gs_pfn" or whatever) +#define wxDL_INIT_FUNC(pfx, name, dynlib) \ + pfx ## name = (name ## _t)(dynlib).GetSymbol(#name) + +#ifdef __WXMSW__ + +// same as wxDL_INIT_FUNC() but appends 'A' or 'W' to the function name, see +// wxDynamicLibrary::GetSymbolAorW() +#define wxDL_INIT_FUNC_AW(pfx, name, dynlib) \ + pfx ## name = (name ## _t)(dynlib).GetSymbolAorW(#name) + +#endif // __WXMSW__ + // the following macros can be used to redirect a whole library to a class and // check at run-time if the library is present and contains all required // methods diff --git a/src/msw/display.cpp b/src/msw/display.cpp index f5e9e84d51..e5d3247e08 100644 --- a/src/msw/display.cpp +++ b/src/msw/display.cpp @@ -517,19 +517,9 @@ wxDisplayFactoryWin32Base::wxDisplayFactoryWin32Base() wxLogNull noLog; - gs_MonitorFromPoint = (MonitorFromPoint_t) - dllUser32.GetSymbol(wxT("MonitorFromPoint")); - if ( !gs_MonitorFromPoint ) - return; - - gs_MonitorFromWindow = (MonitorFromWindow_t) - dllUser32.GetSymbol(wxT("MonitorFromWindow")); - if ( !gs_MonitorFromWindow ) - return; - - gs_GetMonitorInfo = (GetMonitorInfo_t) - dllUser32.GetSymbolAorW(wxT("GetMonitorInfo")); - if ( !gs_GetMonitorInfo ) + if ( (wxDL_INIT_FUNC(gs_, MonitorFromPoint, dllUser32)) == NULL || + (wxDL_INIT_FUNC(gs_, MonitorFromWindow, dllUser32)) == NULL || + (wxDL_INIT_FUNC_AW(gs_, GetMonitorInfo, dllUser32)) == NULL ) return; ms_supportsMultimon = 1; @@ -601,9 +591,7 @@ wxDisplayFactoryMultimon::wxDisplayFactoryMultimon() wxLogNull noLog; wxDynamicLibrary dllUser32(_T("user32.dll")); - pfnEnumDisplayMonitors = (EnumDisplayMonitors_t) - dllUser32.GetSymbol(wxT("EnumDisplayMonitors")); - if ( !pfnEnumDisplayMonitors ) + if ( (wxDL_INIT_FUNC(pfn, EnumDisplayMonitors, dllUser32)) == NULL ) return; } @@ -750,8 +738,7 @@ bool wxDisplayImplMultimon::ChangeMode(const wxVideoMode& mode) wxDynamicLibrary dllUser32(_T("user32.dll")); if ( dllUser32.IsLoaded() ) { - pfnChangeDisplaySettingsEx = (ChangeDisplaySettingsEx_t) - dllUser32.GetSymbolAorW(_T("ChangeDisplaySettingsEx")); + wxDL_INIT_FUNC_AW(pfn, ChangeDisplaySettingsEx, dllUser32); } //else: huh, no user32.dll?? @@ -829,21 +816,19 @@ wxDisplayFactoryDirectDraw::wxDisplayFactoryDirectDraw() if ( !m_dllDDraw.IsLoaded() ) return; - DirectDrawEnumerateEx_t pDDEnumEx = (DirectDrawEnumerateEx_t) - m_dllDDraw.GetSymbolAorW(_T("DirectDrawEnumerateEx")); - if ( !pDDEnumEx ) + DirectDrawEnumerateEx_t + wxDL_INIT_FUNC_AW(pfn, DirectDrawEnumerateEx, m_dllDDraw); + if ( !pfnDirectDrawEnumerateEx ) return; // we can't continue without DirectDrawCreate() later, so resolve it right // now and fail the initialization if it's not available - m_pfnDirectDrawCreate = (DirectDrawCreate_t) - m_dllDDraw.GetSymbol(_T("DirectDrawCreate")); - if ( !m_pfnDirectDrawCreate ) + if ( !wxDL_INIT_FUNC(m_pfn, DirectDrawCreate, m_dllDDraw) ) return; - if ( (*pDDEnumEx)(DDEnumExCallback, - this, - DDENUM_ATTACHEDSECONDARYDEVICES) != DD_OK ) + if ( (*pfnDirectDrawEnumerateEx)(DDEnumExCallback, + this, + DDENUM_ATTACHEDSECONDARYDEVICES) != DD_OK ) { wxLogLastError(_T("DirectDrawEnumerateEx")); } diff --git a/src/msw/taskbar.cpp b/src/msw/taskbar.cpp index 45ef85996c..52e05fee69 100644 --- a/src/msw/taskbar.cpp +++ b/src/msw/taskbar.cpp @@ -61,8 +61,7 @@ static BOOL wxShellNotifyIcon(DWORD dwMessage, NOTIFYICONDATA *pData) wxDynamicLibrary dllShell("shell32.dll"); if ( dllShell.IsLoaded() ) { - s_pfnShell_NotifyIcon = - (Shell_NotifyIcon_t)dllShell.GetSymbolAorW("Shell_NotifyIcon"); + wxDL_INIT_FUNC_AW(s_pfn, Shell_NotifyIcon, dllShell); } // NB: it's ok to destroy dllShell here, we link to shell32.dll