Joe's ErrorString-fn in german environment...?
i think joe will recognise this little fn, except minor changes it is
his...;-)
however, in my _german_ environment, i have the following problem:
a socket is returning WSAECONNABORTED (= 10053) , and that is
perfectly well 'cos i do exactly what is described at msdn: "Software
caused connection abort". But when i call joes fn, i get "Ger=E4t oder
Adresse nicht vorhanden" (in english this would be something like
"device or adress does not exist"). So the question is...
is this just a bug in the german WSOCK32.DLL (has someone freaked up
the msg-tables?) and could please someone with english environment
check this fn on WSAECONNABORTED?
//-------------------------------------------------------------------------=
----
// Translate an error-code from winsock- or system-message-table
bool ErrorString(DWORD errorCode, CString& scString)
{
// The FormatMessage call takes some flags, one of which will be
optional.
// The FORMAT_MESSAGE_FROM_HMODULE forces the system to search the
module
// first, so we set it only if the dll was found.
DWORD flags = FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM;
// this is the HANDLE for the dll holding the WinSock MESSAGETABLE
HMODULE lib = NULL;
// we first get the system-directory
CString path;
LPTSTR p = path.GetBuffer(MAX_PATH);
HRESULT hr = ::SHGetFolderPath(NULL, CSIDL_SYSTEM, NULL,
SHGFP_TYPE_CURRENT, p);
if (SUCCEEDED(hr))
{
path.ReleaseBuffer();
// make shure path ends with a backslash
if (path.Right(1) != _T("\\"))
path += _T("\\");
// this is the windows-dll holding the winsock message-table, load
it
path += _T("WSOCK32.DLL");
lib = ::LoadLibrary(path);
if (lib != NULL)
flags |= FORMAT_MESSAGE_FROM_HMODULE;
}
else
path.ReleaseBuffer();
LPTSTR msg;
bool fRet = (::FormatMessage(flags, (LPCVOID) lib, errorCode, 0,
(LPTSTR)&msg, 0, NULL) != 0);
if (fRet)
{
// remove ending CR and append a NUL
LPTSTR eol = _tcsrchr(msg, _T('\r'));
if(eol != NULL)
*eol = _T('\0');
scString = msg;
}
if (lib != NULL)
::FreeLibrary(lib);
LocalFree(msg);
return fRet;
}