load ws2_32.dll dynamically in wxGetFullHostName()
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22327 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
#endif //WX_PRECOMP
|
||||
|
||||
#include "wx/apptrait.h"
|
||||
#include "wx/dynload.h"
|
||||
|
||||
#include "wx/msw/private.h" // includes <windows.h>
|
||||
#include "wx/msw/missing.h" // CHARSET_HANGUL
|
||||
@@ -143,30 +144,56 @@ 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__))
|
||||
#ifndef __WXMICROWIN__
|
||||
// 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
|
||||
// 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() )
|
||||
{
|
||||
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 ( WSAStartup(MAKEWORD(1, 1), &wsa) == 0 )
|
||||
if ( pfnWSAStartup && pfnWSAStartup(MAKEWORD(1, 1), &wsa) == 0 )
|
||||
{
|
||||
LOAD_WINSOCK_FUNC(gethostname);
|
||||
|
||||
wxString host;
|
||||
char bufA[256];
|
||||
if ( gethostname(bufA, WXSIZEOF(bufA)) == 0 )
|
||||
if ( pfngethostname )
|
||||
{
|
||||
// gethostname() won't usually include the DNS domain name, for
|
||||
// this we need to work a bit more
|
||||
char bufA[256];
|
||||
if ( pfngethostname(bufA, WXSIZEOF(bufA)) == 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(gethostbyname);
|
||||
|
||||
struct hostent *pHostEnt = pfngethostbyname
|
||||
? pfngethostbyname(bufA)
|
||||
: NULL;
|
||||
|
||||
if ( pHostEnt )
|
||||
{
|
||||
// Windows will use DNS internally now
|
||||
pHostEnt = gethostbyaddr(pHostEnt->h_addr, 4, AF_INET);
|
||||
LOAD_WINSOCK_FUNC(gethostbyaddr);
|
||||
|
||||
pHostEnt = pfngethostbyaddr
|
||||
? pfngethostbyaddr(pHostEnt->h_addr,
|
||||
4, AF_INET)
|
||||
: NULL;
|
||||
}
|
||||
|
||||
if ( pHostEnt )
|
||||
@@ -175,8 +202,12 @@ bool wxGetFullHostName(wxChar *buf, int maxSize)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LOAD_WINSOCK_FUNC(WSACleanup);
|
||||
if ( pfnWSACleanup )
|
||||
pfnWSACleanup();
|
||||
|
||||
WSACleanup();
|
||||
|
||||
if ( !host.empty() )
|
||||
{
|
||||
@@ -185,10 +216,8 @@ bool wxGetFullHostName(wxChar *buf, int maxSize)
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
#endif // wxUSE_SOCKETS
|
||||
|
||||
#endif // Win32
|
||||
}
|
||||
#endif // !__WXMICROWIN__
|
||||
|
||||
return wxGetHostName(buf, maxSize);
|
||||
}
|
||||
|
Reference in New Issue
Block a user