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:
Vadim Zeitlin
2003-07-28 00:18:10 +00:00
parent e9877ed3a8
commit 15cdcf6a0e

View File

@@ -32,6 +32,7 @@
#endif //WX_PRECOMP #endif //WX_PRECOMP
#include "wx/apptrait.h" #include "wx/apptrait.h"
#include "wx/dynload.h"
#include "wx/msw/private.h" // includes <windows.h> #include "wx/msw/private.h" // includes <windows.h>
#include "wx/msw/missing.h" // CHARSET_HANGUL #include "wx/msw/missing.h" // CHARSET_HANGUL
@@ -143,52 +144,80 @@ bool wxGetHostName(wxChar *buf, int maxSize)
// get full hostname (with domain name if possible) // get full hostname (with domain name if possible)
bool wxGetFullHostName(wxChar *buf, int maxSize) bool wxGetFullHostName(wxChar *buf, int maxSize)
{ {
#if defined(__WIN32__) && !defined(__WXMICROWIN__) && ! (defined(__GNUWIN32__) && !defined(__MINGW32__)) #ifndef __WXMICROWIN__
// TODO should use GetComputerNameEx() when available // TODO should use GetComputerNameEx() when available
// the idea is that if someone had set wxUSE_SOCKETS to 0 the code // we don't want to always link with Winsock DLL as we might not use it at
// shouldn't use winsock.dll (a.k.a. ws2_32.dll) at all so only use this // all, so load it dynamically here if needed
// code if we link with it anyhow wxDynamicLibrary dllWinsock(_T("ws2_32.dll"), wxDL_VERBATIM);
#if wxUSE_SOCKETS if ( dllWinsock.IsLoaded() )
WSADATA wsa;
if ( WSAStartup(MAKEWORD(1, 1), &wsa) == 0 )
{ {
wxString host; typedef int (PASCAL *WSAStartup_t)(WORD, WSADATA *);
char bufA[256]; typedef int (PASCAL *gethostname_t)(char *, int);
if ( gethostname(bufA, WXSIZEOF(bufA)) == 0 ) 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 LOAD_WINSOCK_FUNC(gethostname);
// this we need to work a bit more
if ( !strchr(bufA, '.') ) wxString host;
if ( pfngethostname )
{ {
struct hostent *pHostEnt = gethostbyname(bufA); char bufA[256];
if ( pfngethostname(bufA, WXSIZEOF(bufA)) == 0 )
if ( pHostEnt )
{ {
// Windows will use DNS internally now // gethostname() won't usually include the DNS domain name,
pHostEnt = gethostbyaddr(pHostEnt->h_addr, 4, AF_INET); // for this we need to work a bit more
} if ( !strchr(bufA, '.') )
{
LOAD_WINSOCK_FUNC(gethostbyname);
if ( pHostEnt ) struct hostent *pHostEnt = pfngethostbyname
{ ? pfngethostbyname(bufA)
host = wxString::FromAscii(pHostEnt->h_name); : 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 // !__WXMICROWIN__
#endif // wxUSE_SOCKETS
#endif // Win32
return wxGetHostName(buf, maxSize); return wxGetHostName(buf, maxSize);
} }