windows-nt/Source/XPSP1/NT/net/ias/services/inc/iasutil.h
2020-09-26 16:20:57 +08:00

225 lines
4.4 KiB
C++

///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 1997, Microsoft Corp. All rights reserved.
//
// FILE
//
// iasutil.h
//
// SYNOPSIS
//
// This file declares assorted utility functions, etc.
//
// MODIFICATION HISTORY
//
// 11/14/1997 Original version.
// 12/17/1997 Added conversion routines.
// 01/08/1998 Added RETURN_ERROR macro.
// 02/26/1998 Added ANSI versions of the IP address functions.
// 04/17/1998 Added CComInterlockedPtr.
// 08/11/1998 Major overhaul and consolidation of utility functions.
//
///////////////////////////////////////////////////////////////////////////////
#ifndef _IASUTIL_H_
#define _IASUTIL_H_
#ifdef __cplusplus
extern "C" {
#endif
///////////////////////////////////////////////////////////////////////////////
//
// String functions.
//
///////////////////////////////////////////////////////////////////////////////
LPWSTR
WINAPI
ias_wcsdup(
IN PCWSTR str
);
LPSTR
WINAPI
com_strdup(
IN PCSTR str
);
LPWSTR
WINAPI
com_wcsdup(
IN PCWSTR str
);
INT
WINAPI
ias_wcscmp(
IN PCWSTR str1,
IN PCWSTR str2
);
LPWSTR
WINAPIV
ias_makewcs(LPCWSTR, ...);
///////////////////////////////////////////////////////////////////////////////
//
// IP address conversion functions.
//
///////////////////////////////////////////////////////////////////////////////
ULONG
WINAPI
ias_inet_wtoh(
PCWSTR cp
);
PWSTR
WINAPI
ias_inet_htow(
IN ULONG addr,
OUT PWSTR dst
);
ULONG
WINAPI
ias_inet_atoh(
PCSTR cp
);
PSTR
WINAPI
ias_inet_htoa(
IN ULONG addr,
OUT PSTR dst
);
ULONG
WINAPI
IASStringToSubNetW(
PCWSTR cp,
ULONG* width
);
ULONG
WINAPI
IASStringToSubNetA(
PCSTR cp,
ULONG* width
);
///////////////////////////////////////////////////////////////////////////////
//
// Functions to move integers to and from a buffer.
//
///////////////////////////////////////////////////////////////////////////////
VOID
WINAPI
IASInsertDWORD(
IN PBYTE pBuffer,
IN DWORD dwValue
);
DWORD
WINAPI
IASExtractDWORD(
IN CONST BYTE *pBuffer
);
VOID
WINAPI
IASInsertWORD(
IN PBYTE pBuffer,
IN WORD wValue
);
WORD
WINAPI
IASExtractWORD(
IN CONST BYTE *pBuffer
);
#ifdef __cplusplus
}
// We need this for std::bad_alloc.
#include <new>
// For _com_error
#include "comdef.h"
///////////////////////////////////////////////////////////////////////////////
//
// Extensions to _com_error to handle Win32 errors.
//
///////////////////////////////////////////////////////////////////////////////
// Exception class for Win32 errors.
class _w32_error : public _com_error
{
public:
_w32_error(DWORD errorCode) throw ()
: _com_error(HRESULT_FROM_WIN32(errorCode)) { }
DWORD Error() const
{
return _com_error::Error() & 0x0000FFFF;
}
};
// Throw a _w32_error.
void __stdcall _w32_issue_error(DWORD errorCode = GetLastError())
throw (_w32_error);
// Utility functions for checking Win32 return values and throwing an
// exception upon failure.
namespace _w32_util
{
// Check handles, memory, etc.
inline void CheckAlloc(const void* p) throw (_w32_error)
{
if (p == NULL) { _w32_issue_error(); }
}
// Check 32-bit error code.
inline void CheckError(DWORD errorCode) throw (_w32_error)
{
if (errorCode != NO_ERROR) { _w32_issue_error(errorCode); }
}
// Check boolean success flag.
inline void CheckSuccess(BOOL success) throw (_w32_error)
{
if (!success) { _w32_issue_error(); }
}
}
///////////////////////////////////////////////////////////////////////////////
//
// Miscellaneous macros.
//
///////////////////////////////////////////////////////////////////////////////
// Allocate an array on the stack.
#define IAS_STACK_NEW(type, count) \
new (_alloca(sizeof(type) * count)) type[count]
// Safely release an object.
#define IAS_DEREF(obj) \
if (obj) { (obj)->Release(); (obj) = NULL; }
// Return the error code from a failed COM invocation. Useful if you don't
// have to do any special clean-up.
#define RETURN_ERROR(expr) \
{ HRESULT __hr__ = (expr); if (FAILED(__hr__)) return __hr__; }
// Catch any exception and return an appropriate error code.
#define CATCH_AND_RETURN() \
catch (const std::bad_alloc&) { return E_OUTOFMEMORY; } \
catch (const _com_error& ce) { return ce.Error(); } \
catch (...) { return E_FAIL; }
#endif
#endif // _IASUTIL_H_