//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: OAUTDLL.hxx // // Contents: // // Classes: // // Functions: // // History: 05-15-97 DanpoZ (Danpo Zhang) Created // //---------------------------------------------------------------------------- #ifndef OAUTDLL_HXX_ #define OAUTDLL_HXX_ //+--------------------------------------------------------------------------- // // Class: COleAutDll // // Purpose: class wrapper for calling API from delay // loaded oleaut32.dll // // Interface: // // // History: 05-15-97 DanpoZ (Danpo Zhang) Created // // Notes: // //---------------------------------------------------------------------------- class COleAutDll { public: // ctor, dtor COleAutDll(); ~COleAutDll(); // member funcs HRESULT Init(); #define DELAYOLEAUTAPI_HR(_fn, _args, _nargs) \ HRESULT _fn _args { \ HRESULT hr = Init(); \ if (SUCCEEDED(hr)) { \ hr = _pfn##_fn _nargs; \ } \ return hr; } \ HRESULT (STDAPICALLTYPE* _pfn##_fn) _args; #define DELAYOLEAUTAPI_BSTR(_fn, _args, _nargs) \ BSTR _fn _args { \ HRESULT hres = Init(); \ BSTR bstr = NULL; \ if (SUCCEEDED(hres)) { \ bstr = _pfn##_fn _nargs; \ } \ return bstr; } \ BSTR (STDAPICALLTYPE* _pfn##_fn) _args; #define DELAYOLEAUTAPI_INT(_fn, _args, _nargs) \ INT _fn _args { \ HRESULT hres = Init(); \ INT iRet = FALSE;\ if (SUCCEEDED(hres)) { \ iRet = _pfn##_fn _nargs; \ } \ return iRet; } \ INT (STDAPICALLTYPE* _pfn##_fn) _args; #define DELAYOLEAUTAPI_UINT(_fn, _args, _nargs) \ INT _fn _args { \ HRESULT hres = Init(); \ UINT iRet ;\ if (SUCCEEDED(hres)) { \ iRet = _pfn##_fn _nargs; \ } \ return iRet; } \ UINT (STDAPICALLTYPE* _pfn##_fn) _args; #define DELAYOLEAUTAPI_VOID(_fn, _args, _nargs) \ void _fn _args { \ HRESULT hres = Init(); \ if (SUCCEEDED(hres)) { \ _pfn##_fn _nargs; \ } \ } \ void (STDAPICALLTYPE* _pfn##_fn) _args; // APIs DELAYOLEAUTAPI_HR( VariantClear, (VARIANTARG* pvarg), (pvarg) ) DELAYOLEAUTAPI_HR( VariantInit, (VARIANTARG* pvarg), (pvarg) ) DELAYOLEAUTAPI_HR( VariantCopy, (VARIANTARG* pvargDest, VARIANTARG* pvargSrc ), (pvargDest, pvargSrc) ) DELAYOLEAUTAPI_HR( VariantChangeType, (VARIANTARG* pvargDest, VARIANTARG* pvargSrc, USHORT wFlags, VARTYPE vt ), (pvargDest, pvargSrc, wFlags, vt) ) DELAYOLEAUTAPI_HR( LoadTypeLib, (const OLECHAR* szFile, ITypeLib** pptlib ), (szFile, pptlib) ) DELAYOLEAUTAPI_BSTR( SysAllocStringByteLen, (LPCSTR psz, UINT len ), (psz, len ) ) DELAYOLEAUTAPI_BSTR( SysAllocString, (const OLECHAR* psz), (psz) ) DELAYOLEAUTAPI_UINT( SysStringByteLen, (BSTR bstr), (bstr) ) DELAYOLEAUTAPI_VOID( SysFreeString, (BSTR bstr), (bstr) ) private: BOOL _fInited; HMODULE _hMod; }; //+--------------------------------------------------------------------------- // // Method: COleAutDll::COleAutDll // // Synopsis: // // History: 05-15-97 DanpoZ (Danpo Zhang) Created // // Notes: // //---------------------------------------------------------------------------- inline COleAutDll::COleAutDll() { _fInited = FALSE; _hMod = NULL; } //+--------------------------------------------------------------------------- // // Method: COleAutDll::~COleAutDll // // Synopsis: // // History: 05-15-97 DanpoZ (Danpo Zhang) Created // // Notes: // //---------------------------------------------------------------------------- inline COleAutDll::~COleAutDll() { if( _fInited) FreeLibrary(_hMod); } //+--------------------------------------------------------------------------- // // Method: COleAutDll::Init // // Synopsis: // // History: 05-15-97 DanpoZ (Danpo Zhang) Created // // Notes: // //---------------------------------------------------------------------------- inline HRESULT COleAutDll::Init() { HRESULT hr = NOERROR; if( !_fInited ) { _hMod = LoadLibrary("oleaut32.dll"); if( !_hMod ) hr = HRESULT_FROM_WIN32(GetLastError()); else { #define CHECKOAUTAPI(_fn) \ *(FARPROC*)&(_pfn##_fn) = GetProcAddress(_hMod, #_fn); \ if( !(_pfn##_fn)) hr = E_UNEXPECTED; CHECKOAUTAPI(VariantClear); CHECKOAUTAPI(VariantInit); CHECKOAUTAPI(VariantCopy); CHECKOAUTAPI(VariantChangeType); CHECKOAUTAPI(SysAllocStringByteLen); CHECKOAUTAPI(SysAllocString); CHECKOAUTAPI(SysStringByteLen); CHECKOAUTAPI(SysFreeString); CHECKOAUTAPI(LoadTypeLib); } if( hr == NOERROR ) _fInited = TRUE; } return hr; } #endif