⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utilities.h

📁 用于在线office文档编辑的控件。可以在线新建文档、修改文档
💻 H
字号:
/***************************************************************************
 * UTILITIES.H
 *
 * DSOFramer: Common Utilities and Macros (Shared)
 *
 *  Copyright ?999-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)...

////////////////////////////////////////////////////////////////////////
// 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) LooksLikeFTP(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);

////////////////////////////////////////////////////////////////////////
// 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 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)))

////////////////////////////////////////////////////////////////////////
// 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  ASSERT(m_cRef > 0); m_cRef--;
#define IMPLEMENT_DEBUG_REFSET   m_cRef = 0;
#define IMPLEMENT_DEBUG_REFCHECK ASSERT(m_cRef == 0);
#else
#define DEFINE_REFCOUNT
#define IMPLEMENT_DEBUG_ADDREF
#define IMPLEMENT_DEBUG_RELEASE
#define IMPLEMENT_DEBUG_REFSET
#define IMPLEMENT_DEBUG_REFCHECK
#endif /* !_DEBUG */

#define BEGIN_INTERFACE_PART(localClass, baseClass) \
class X##localClass : public baseClass \
{ public: X##localClass(){IMPLEMENT_DEBUG_REFSET} \
         ~X##localClass(){IMPLEMENT_DEBUG_REFCHECK} \
		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 \
		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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -