2007-12-10 20:53:52 +00:00

242 lines
10 KiB
C++

/***************************************************************************
* UTILITIES.H
*
* DSOFramer: Common Utilities and Macros (Shared)
*
* Copyright ©1999-2004; Microsoft Corporation. All rights reserved.
* Written by Microsoft Developer Support Office Integration (PSS DSOI)
*
* This code is provided via KB 311765 as a sample. It is not a formal
* product and has not been tested with all containers or servers. Use it
* for educational purposes only. See the EULA.TXT file included in the
* KB download for full terms of use and restrictions.
*
* THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND,
* EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR PURPOSE.
*
***************************************************************************/
#ifndef DS_UTILITIES_H
#define DS_UTILITIES_H
#include <commdlg.h>
#include <oledlg.h>
////////////////////////////////////////////////////////////////////////
// Fixed Win32 Errors as HRESULTs
//
#define E_WIN32_BUFFERTOOSMALL 0x8007007A //HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER)
#define E_WIN32_ACCESSVIOLATION 0x800701E7 //HRESULT_FROM_WIN32(ERROR_INVALID_ADDRESS)
#define E_WIN32_LASTERROR (0x80070000 | GetLastError()) // Assured Error with last Win32 code
#define E_VBA_NOREMOTESERVER 0x800A01CE
////////////////////////////////////////////////////////////////////////
// Heap Allocation
//
STDAPI_(LPVOID) DsoMemAlloc(DWORD cbSize);
STDAPI_(void) DsoMemFree(LPVOID ptr);
// Override new/delete to use our task allocator
// (removing CRT dependency will improve code performance and size)...
void * _cdecl operator new(size_t size);
void _cdecl operator delete(void *ptr);
////////////////////////////////////////////////////////////////////////
// String Manipulation Functions
//
STDAPI DsoConvertToUnicodeEx(LPCSTR pszMbcsString, DWORD cbMbcsLen, LPWSTR pwszUnicode, DWORD cbUniLen, UINT uiCodePage);
STDAPI DsoConvertToMBCSEx(LPCWSTR pwszUnicodeString, DWORD cbUniLen, LPSTR pwszMbcsString, DWORD cbMbcsLen, UINT uiCodePage);
STDAPI_(LPWSTR) DsoConvertToLPWSTR(LPCSTR pszMbcsString);
STDAPI_(BSTR) DsoConvertToBSTR(LPCSTR pszMbcsString);
STDAPI_(LPWSTR) DsoConvertToLPOLESTR(LPCWSTR pwszUnicodeString);
STDAPI_(LPSTR) DsoConvertToMBCS(LPCWSTR pwszUnicodeString);
STDAPI_(UINT) DsoCompareStringsEx(LPCWSTR pwsz1, INT cch1, LPCWSTR pwsz2, INT cch2);
STDAPI_(LPWSTR) DsoCopyString(LPCWSTR pwszString);
STDAPI_(LPWSTR) DsoCopyStringCat(LPCWSTR pwszString1, LPCWSTR pwszString2);
STDAPI_(LPWSTR) DsoCopyStringCatEx(LPCWSTR pwszBaseString, UINT cStrs, LPCWSTR *ppwszStrs);
STDAPI_(LPSTR) DsoCLSIDtoLPSTR(REFCLSID clsid);
////////////////////////////////////////////////////////////////////////
// URL Helpers
//
STDAPI_(BOOL) LooksLikeLocalFile(LPCWSTR pwsz);
STDAPI_(BOOL) LooksLikeUNC(LPCWSTR pwsz);
STDAPI_(BOOL) LooksLikeHTTP(LPCWSTR pwsz);
STDAPI_(BOOL) GetTempPathForURLDownload(WCHAR* pwszURL, WCHAR** ppwszLocalFile);
STDAPI URLDownloadFile(LPUNKNOWN punk, WCHAR* pwszURL, WCHAR* pwszLocalFile);
////////////////////////////////////////////////////////////////////////
// OLE Conversion Functions
//
STDAPI_(void) DsoHimetricToPixels(LONG* px, LONG* py);
STDAPI_(void) DsoPixelsToHimetric(LONG* px, LONG* py);
////////////////////////////////////////////////////////////////////////
// GDI Helper Functions
//
STDAPI_(HBITMAP) DsoGetBitmapFromWindow(HWND hwnd);
////////////////////////////////////////////////////////////////////////
// Windows Helper Functions
//
STDAPI_(BOOL) IsWindowChild(HWND hwndParent, HWND hwndChild);
////////////////////////////////////////////////////////////////////////
// OLE/Typelib Function Wrappers
//
STDAPI DsoGetTypeInfoEx(REFGUID rlibid, LCID lcid, WORD wVerMaj, WORD wVerMin, HMODULE hResource, REFGUID rguid, ITypeInfo** ppti);
STDAPI DsoDispatchInvoke(LPDISPATCH pdisp, LPOLESTR pwszname, DISPID dspid, WORD wflags, DWORD cargs, VARIANT* rgargs, VARIANT* pvtret);
STDAPI DsoReportError(HRESULT hr, LPWSTR pwszCustomMessage, EXCEPINFO* peiDispEx);
////////////////////////////////////////////////////////////////////////
// Unicode Win32 API wrappers (handles thunk down for Win9x)
//
STDAPI_(BOOL) FFileExists(WCHAR* wzPath);
STDAPI_(BOOL) FOpenLocalFile(WCHAR* wzFilePath, DWORD dwAccess, DWORD dwShareMode, DWORD dwCreate, HANDLE* phFile);
STDAPI_(BOOL) FPerformShellOp(DWORD dwOp, WCHAR* wzFrom, WCHAR* wzTo);
STDAPI_(BOOL) FGetModuleFileName(HMODULE hModule, WCHAR** wzFileName);
STDAPI_(BOOL) FIsIECacheFile(LPWSTR pwszFile);
STDAPI_(BOOL) FDrawText(HDC hdc, WCHAR* pwsz, LPRECT prc, UINT fmt);
STDAPI_(BOOL) FSetRegKeyValue(HKEY hk, WCHAR* pwsz);
STDAPI_(BOOL) FOpenPrinter(LPCWSTR pwszPrinter, LPHANDLE phandle);
STDAPI_(BOOL) FGetPrinterSettings(HANDLE hprinter, LPWSTR *ppwszProcessor, LPWSTR *ppwszDevice, LPWSTR *ppwszOutput, LPDEVMODEW *ppdvmode, DWORD *pcbSize);
STDAPI DsoGetFileFromUser(HWND hwndOwner, LPCWSTR pwzTitle, DWORD dwFlags,
LPCWSTR pwzFilter, DWORD dwFiltIdx, LPCWSTR pwszDefExt, LPCWSTR pwszCurrentItem, BOOL fShowSave,
BSTR *pbstrFile, BOOL *pfReadOnly);
STDAPI DsoGetOleInsertObjectFromUser(HWND hwndOwner, LPCWSTR pwzTitle, DWORD dwFlags,
BOOL fDocObjectOnly, BOOL fAllowControls, BSTR *pbstrResult, UINT *ptype);
////////////////////////////////////////////////////////////////////////
// Common macros -- Used to make code more readable.
//
#define SEH_TRY __try {
#define SEH_EXCEPT(hr) } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION){hr = E_WIN32_ACCESSVIOLATION;}
#define SEH_EXCEPT_NULL } __except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION){}
#define SEH_START_FINALLY } __finally {
#define SEH_END_FINALLY }
#define RETURN_ON_FAILURE(x) if (FAILED(x)) return (x)
#define GOTO_ON_FAILURE(x, lbl) if (FAILED(x)) goto lbl
#define CHECK_NULL_RETURN(v, e) if ((v) == NULL) return (e)
#define SAFE_ADDREF_INTERFACE if (x) { (x)->AddRef(); }
#define SAFE_RELEASE_INTERFACE(x) if (x) { (x)->Release(); (x) = NULL; }
#define SAFE_SET_INTERFACE(x, y) if (((x) = (y)) != NULL) ((IUnknown*)(x))->AddRef()
#define SAFE_FREESTRING(s) if (s) { DsoMemFree(s); (s) = NULL; }
#define SAFE_FREEBSTR(s) if (s) { SysFreeString(s); (s) = NULL; }
VARIANT* __fastcall DsoPVarFromPVarRef(VARIANT* px);
BOOL __fastcall DsoIsVarParamMissing(VARIANT* px);
LPWSTR __fastcall DsoPVarWStrFromPVar(VARIANT* px);
SAFEARRAY* __fastcall DsoPVarArrayFromPVar(VARIANT* px);
IUnknown* __fastcall DsoPVarUnkFromPVar(VARIANT* px);
SHORT __fastcall DsoPVarShortFromPVar(VARIANT* px, SHORT fdef);
LONG __fastcall DsoPVarLongFromPVar(VARIANT* px, LONG fdef);
BOOL __fastcall DsoPVarBoolFromPVar(VARIANT* px, BOOL fdef);
#define PARAM_IS_MISSING(x) DsoIsVarParamMissing(DsoPVarFromPVarRef((x)))
#define LPWSTR_FROM_VARIANT(x) DsoPVarWStrFromPVar(DsoPVarFromPVarRef(&(x)))
#define LONG_FROM_VARIANT(x, y) DsoPVarLongFromPVar(DsoPVarFromPVarRef(&(x)), (y))
#define BOOL_FROM_VARIANT(x, y) DsoPVarBoolFromPVar(DsoPVarFromPVarRef(&(x)), (y))
#define PUNK_FROM_VARIANT(x) DsoPVarUnkFromPVar(DsoPVarFromPVarRef(&(x)))
#define PSARRAY_FROM_VARIANT(x) DsoPVarArrayFromPVar(DsoPVarFromPVarRef(&(x)))
#define ASCII_UPPERCASE(x) ((((x) > 96) && ((x) < 123)) ? (x) - 32 : (x))
#define ASCII_LOWERCASE(x) ((((x) > 64) && ((x) < 91)) ? (x) + 32 : (x))
////////////////////////////////////////////////////////////////////////
// Debug macros
//
#ifdef _DEBUG
#define ASSERT(x) if(!(x)) DebugBreak()
#define ODS(x) OutputDebugString(x)
#define TRACE1(sz, arg1) { \
CHAR ach[1024]; \
wsprintf(ach, (sz), (arg1)); \
ODS(ach); }
#define TRACE2(sz, arg1, arg2) { \
CHAR ach[1024]; \
wsprintf(ach, (sz), (arg1), (arg2)); \
ODS(ach); }
#define TRACE3(sz, arg1, arg2, arg3) { \
CHAR ach[1024]; \
wsprintf(ach, (sz), (arg1), (arg2), (arg3)); \
ODS(ach); }
#define TRACE_LPRECT(sz, lprc) { \
CHAR ach[1024]; \
wsprintf(ach, "RECT %s - left=%d, top=%d, right=%d, bottom=%d\n", \
(sz), (lprc)->left, (lprc)->top, (lprc)->right, (lprc)->bottom); \
ODS(ach); }
#else // !defined(_DEBUG)
#define ASSERT(x)
#define ODS(x)
#define TRACE1(sz, arg1)
#define TRACE2(sz, arg1, arg2)
#define TRACE3(sz, arg1, arg2, arg3)
#define TRACE_LPRECT(sz, lprc)
#endif // (_DEBUG)
////////////////////////////////////////////////////////////////////////
// Macros for Nested COM Interfaces
//
#ifdef _DEBUG
#define DEFINE_REFCOUNT ULONG m_cRef;
#define IMPLEMENT_DEBUG_ADDREF m_cRef++;
#define IMPLEMENT_DEBUG_RELEASE(x) ASSERT(m_cRef > 0); m_cRef--; if (m_cRef == 0){ODS(" > I" #x " released\n");}
#define IMPLEMENT_DEBUG_REFSET m_cRef = 0;
#define IMPLEMENT_DEBUG_REFCHECK(x) ASSERT(m_cRef == 0); if (m_cRef != 0){ODS(" * I" #x " NOT released!!\n");}
#else
#define DEFINE_REFCOUNT
#define IMPLEMENT_DEBUG_ADDREF
#define IMPLEMENT_DEBUG_RELEASE(x)
#define IMPLEMENT_DEBUG_REFSET
#define IMPLEMENT_DEBUG_REFCHECK(x)
#endif /* !_DEBUG */
#define BEGIN_INTERFACE_PART(localClass, baseClass) \
class X##localClass : public baseClass \
{ public: X##localClass(){IMPLEMENT_DEBUG_REFSET} \
~X##localClass(){IMPLEMENT_DEBUG_REFCHECK(##localClass)} \
STDMETHOD(QueryInterface)(REFIID iid, PVOID* ppvObj); \
STDMETHOD_(ULONG, AddRef)(); \
STDMETHOD_(ULONG, Release)(); \
DEFINE_REFCOUNT
#define END_INTERFACE_PART(localClass) \
} m_x##localClass; \
friend class X##localClass;
#define METHOD_PROLOGUE(theClass, localClass) \
theClass* pThis = \
((theClass*)(((BYTE*)this) - (size_t)&(((theClass*)0)->m_x##localClass)));
#define IMPLEMENT_INTERFACE_UNKNOWN(theClass, localClass) \
ULONG theClass::X##localClass::AddRef() { \
METHOD_PROLOGUE(theClass, localClass) \
IMPLEMENT_DEBUG_ADDREF \
return pThis->AddRef(); \
} \
ULONG theClass::X##localClass::Release() { \
METHOD_PROLOGUE(theClass, localClass) \
IMPLEMENT_DEBUG_RELEASE(##localClass) \
return pThis->Release(); \
} \
STDMETHODIMP theClass::X##localClass::QueryInterface(REFIID iid, void **ppvObj) { \
METHOD_PROLOGUE(theClass, localClass) \
return pThis->QueryInterface(iid, ppvObj); \
}
#endif //DS_UTILITIES_H