// Copyright (c) 2000 Microsoft Corp.
//
// random other stuff



#ifndef MISC_HPP_INCLUDED
#define MISC_HPP_INCLUDED



void
logMessage(const wchar_t* msg)
{
   if (msg)
   {
      ::OutputDebugString(L"dnswiz: ");
      ::OutputDebugString(msg);
      ::OutputDebugString(L"\n");
   }
}



void
logHresult(HRESULT hr)
{                                                              
   wchar_t buf[1024];                                          
   wsprintf(buf, L"HRESULT = 0x%08X\n", (hr));                 
   logMessage(buf);                               
}                                                              



#ifdef DBG

#define LOG_HRESULT(hr)    logHresult(hr)
#define LOG_MESSAGE(msg)   logMessage(msg)

#else

#define LOG_HRESULT(hr)
#define LOG_MESSAGE(msg)

#endif DBG



#define BREAK_ON_FAILED_HRESULT(hr,msg)                           \
   if (FAILED(hr))                                                \
   {                                                              \
      LOG_MESSAGE(msg);                                           \
      LOG_HRESULT(hr);                                            \
      break;                                                      \
   }



// A BSTR wrapper that frees itself upon destruction.
//
// From Box, D. Essential COM.  pp 80-81.  Addison-Wesley. ISBN 0-201-63446-5

class AutoBstr
{
   public:

   explicit         
   AutoBstr(const wchar_t* s)
      :
      bstr(::SysAllocString(s))
   {
      ASSERT(s);
   }

   ~AutoBstr()
   {
      ::SysFreeString(bstr);
      bstr = 0;
   }

   operator BSTR () const
   {
      return bstr;
   }

   private:

   BSTR bstr;
};


#endif   // MISC_HPP_INCLUDED