X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/de564874d60233c977c93496da1aa406245c37c2..52410d542efd95179255f613a78b8cc748d7faf6:/src/msw/utils.cpp?ds=sidebyside diff --git a/src/msw/utils.cpp b/src/msw/utils.cpp index 4ba9ff2a28..89c2b89a0b 100644 --- a/src/msw/utils.cpp +++ b/src/msw/utils.cpp @@ -32,11 +32,13 @@ #endif //WX_PRECOMP #include "wx/apptrait.h" +#include "wx/dynload.h" #include "wx/msw/private.h" // includes #include "wx/msw/missing.h" // CHARSET_HANGUL -#if defined(__GNUWIN32_OLD__) || defined(__WXWINCE__) +#if defined(__GNUWIN32_OLD__) || defined(__WXWINCE__) \ + || defined(__CYGWIN32__) // apparently we need to include winsock.h to get WSADATA and other stuff // used in wxGetFullHostName() with the old mingw32 versions #include @@ -143,52 +145,80 @@ bool wxGetHostName(wxChar *buf, int maxSize) // get full hostname (with domain name if possible) bool wxGetFullHostName(wxChar *buf, int maxSize) { -#if defined(__WIN32__) && !defined(__WXMICROWIN__) && ! (defined(__GNUWIN32__) && !defined(__MINGW32__)) +#if !defined( __WXMICROWIN__) && wxUSE_DYNAMIC_LOADER // TODO should use GetComputerNameEx() when available - // the idea is that if someone had set wxUSE_SOCKETS to 0 the code - // shouldn't use winsock.dll (a.k.a. ws2_32.dll) at all so only use this - // code if we link with it anyhow -#if wxUSE_SOCKETS - WSADATA wsa; - if ( WSAStartup(MAKEWORD(1, 1), &wsa) == 0 ) + // we don't want to always link with Winsock DLL as we might not use it at + // all, so load it dynamically here if needed + wxDynamicLibrary dllWinsock(_T("ws2_32.dll"), wxDL_VERBATIM); + if ( dllWinsock.IsLoaded() ) { - wxString host; - char bufA[256]; - if ( gethostname(bufA, WXSIZEOF(bufA)) == 0 ) + typedef int (PASCAL *WSAStartup_t)(WORD, WSADATA *); + typedef int (PASCAL *gethostname_t)(char *, int); + typedef hostent* (PASCAL *gethostbyname_t)(const char *); + typedef hostent* (PASCAL *gethostbyaddr_t)(const char *, int , int); + typedef int (PASCAL *WSACleanup_t)(void); + + #define LOAD_WINSOCK_FUNC(func) \ + func ## _t \ + pfn ## func = (func ## _t)dllWinsock.GetSymbol(_T(#func)) + + LOAD_WINSOCK_FUNC(WSAStartup); + + WSADATA wsa; + if ( pfnWSAStartup && pfnWSAStartup(MAKEWORD(1, 1), &wsa) == 0 ) { - // gethostname() won't usually include the DNS domain name, for - // this we need to work a bit more - if ( !strchr(bufA, '.') ) - { - struct hostent *pHostEnt = gethostbyname(bufA); + LOAD_WINSOCK_FUNC(gethostname); - if ( pHostEnt ) + wxString host; + if ( pfngethostname ) + { + char bufA[256]; + if ( pfngethostname(bufA, WXSIZEOF(bufA)) == 0 ) { - // Windows will use DNS internally now - pHostEnt = gethostbyaddr(pHostEnt->h_addr, 4, AF_INET); - } + // gethostname() won't usually include the DNS domain name, + // for this we need to work a bit more + if ( !strchr(bufA, '.') ) + { + LOAD_WINSOCK_FUNC(gethostbyname); - if ( pHostEnt ) - { - host = wxString::FromAscii(pHostEnt->h_name); + struct hostent *pHostEnt = pfngethostbyname + ? pfngethostbyname(bufA) + : NULL; + + if ( pHostEnt ) + { + // Windows will use DNS internally now + LOAD_WINSOCK_FUNC(gethostbyaddr); + + pHostEnt = pfngethostbyaddr + ? pfngethostbyaddr(pHostEnt->h_addr, + 4, AF_INET) + : NULL; + } + + if ( pHostEnt ) + { + host = wxString::FromAscii(pHostEnt->h_name); + } + } } } - } - WSACleanup(); + LOAD_WINSOCK_FUNC(WSACleanup); + if ( pfnWSACleanup ) + pfnWSACleanup(); - if ( !host.empty() ) - { - wxStrncpy(buf, host, maxSize); - return TRUE; + if ( !host.empty() ) + { + wxStrncpy(buf, host, maxSize); + + return TRUE; + } } } - -#endif // wxUSE_SOCKETS - -#endif // Win32 +#endif // !__WXMICROWIN__ return wxGetHostName(buf, maxSize); } @@ -892,7 +922,7 @@ bool wxShutdown(wxShutdownFlags wFlags) return FALSE; } - bOK = ::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE | EWX_REBOOT, 0) != 0; + bOK = ::ExitWindowsEx(flags, 0) != 0; } return bOK; @@ -983,7 +1013,7 @@ wxString wxGetOsDescription() #endif // Win32/16 } -int wxAppTraits::GetOSVersion(int *verMaj, int *verMin) +wxToolkitInfo& wxAppTraits::GetToolkitInfo() { // cache the version info, it's not going to change // @@ -1022,17 +1052,17 @@ int wxAppTraits::GetOSVersion(int *verMaj, int *verMin) case VER_PLATFORM_WIN32_CE: s_ver = wxWINDOWS_CE; break; -#endif +#endif } } } - if ( verMaj ) - *verMaj = s_major; - if ( verMin ) - *verMin = s_minor; - - return s_ver; + static wxToolkitInfo info; + info.versionMajor = s_major; + info.versionMinor = s_minor; + info.os = s_ver; + info.name = _T("wxBase"); + return info; } // ---------------------------------------------------------------------------- @@ -1202,3 +1232,62 @@ extern long wxCharsetToCodepage(const wxChar *name) #endif // wxUSE_FONTMAP/!wxUSE_FONTMAP +/* + Creates a hidden window with supplied window proc registering the class for + it if necesssary (i.e. the first time only). Caller is responsible for + destroying the window and unregistering the class (note that this must be + done because wxWindows may be used as a DLL and so may be loaded/unloaded + multiple times into/from the same process so we cna't rely on automatic + Windows class unregistration). + + pclassname is a pointer to a caller stored classname, which must initially be + NULL. classname is the desired wndclass classname. If function succesfully + registers the class, pclassname will be set to classname. + */ +extern "C" WXDLLIMPEXP_BASE HWND +wxCreateHiddenWindow(LPCTSTR *pclassname, LPCTSTR classname, WNDPROC wndproc) +{ + wxCHECK_MSG( classname && pclassname && wndproc, NULL, + _T("NULL parameter in wxCreateHiddenWindow") ); + + // register the class fi we need to first + if ( *pclassname == NULL ) + { + WNDCLASS wndclass; + wxZeroMemory(wndclass); + + wndclass.lpfnWndProc = wndproc; + wndclass.hInstance = wxGetInstance(); + wndclass.lpszClassName = classname; + + if ( !::RegisterClass(&wndclass) ) + { + wxLogLastError(wxT("RegisterClass() in wxCreateHiddenWindow")); + + return NULL; + } + + *pclassname = classname; + } + + // next create the window + HWND hwnd = ::CreateWindow + ( + *pclassname, + NULL, + 0, 0, 0, 0, + 0, + (HWND) NULL, + (HMENU)NULL, + wxGetInstance(), + (LPVOID) NULL + ); + + if ( !hwnd ) + { + wxLogLastError(wxT("CreateWindow() in wxCreateHiddenWindow")); + } + + return hwnd; +} +