Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

244 lines
5.6 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1992 - 1995.
  5. //
  6. // File: OAUTDLL.hxx
  7. //
  8. // Contents:
  9. //
  10. // Classes:
  11. //
  12. // Functions:
  13. //
  14. // History: 05-15-97 DanpoZ (Danpo Zhang) Created
  15. //
  16. //----------------------------------------------------------------------------
  17. #ifndef OAUTDLL_HXX_
  18. #define OAUTDLL_HXX_
  19. //+---------------------------------------------------------------------------
  20. //
  21. // Class: COleAutDll
  22. //
  23. // Purpose: class wrapper for calling API from delay
  24. // loaded oleaut32.dll
  25. //
  26. // Interface:
  27. //
  28. //
  29. // History: 05-15-97 DanpoZ (Danpo Zhang) Created
  30. //
  31. // Notes:
  32. //
  33. //----------------------------------------------------------------------------
  34. class COleAutDll
  35. {
  36. public:
  37. // ctor, dtor
  38. COleAutDll();
  39. ~COleAutDll();
  40. // member funcs
  41. HRESULT Init();
  42. #define DELAYOLEAUTAPI_HR(_fn, _args, _nargs) \
  43. HRESULT _fn _args { \
  44. HRESULT hr = Init(); \
  45. if (SUCCEEDED(hr)) { \
  46. hr = _pfn##_fn _nargs; \
  47. } \
  48. return hr; } \
  49. HRESULT (STDAPICALLTYPE* _pfn##_fn) _args;
  50. #define DELAYOLEAUTAPI_BSTR(_fn, _args, _nargs) \
  51. BSTR _fn _args { \
  52. HRESULT hres = Init(); \
  53. BSTR bstr = NULL; \
  54. if (SUCCEEDED(hres)) { \
  55. bstr = _pfn##_fn _nargs; \
  56. } \
  57. return bstr; } \
  58. BSTR (STDAPICALLTYPE* _pfn##_fn) _args;
  59. #define DELAYOLEAUTAPI_INT(_fn, _args, _nargs) \
  60. INT _fn _args { \
  61. HRESULT hres = Init(); \
  62. INT iRet = FALSE;\
  63. if (SUCCEEDED(hres)) { \
  64. iRet = _pfn##_fn _nargs; \
  65. } \
  66. return iRet; } \
  67. INT (STDAPICALLTYPE* _pfn##_fn) _args;
  68. #define DELAYOLEAUTAPI_UINT(_fn, _args, _nargs) \
  69. INT _fn _args { \
  70. HRESULT hres = Init(); \
  71. UINT iRet ;\
  72. if (SUCCEEDED(hres)) { \
  73. iRet = _pfn##_fn _nargs; \
  74. } \
  75. return iRet; } \
  76. UINT (STDAPICALLTYPE* _pfn##_fn) _args;
  77. #define DELAYOLEAUTAPI_VOID(_fn, _args, _nargs) \
  78. void _fn _args { \
  79. HRESULT hres = Init(); \
  80. if (SUCCEEDED(hres)) { \
  81. _pfn##_fn _nargs; \
  82. } \
  83. } \
  84. void (STDAPICALLTYPE* _pfn##_fn) _args;
  85. // APIs
  86. DELAYOLEAUTAPI_HR( VariantClear,
  87. (VARIANTARG* pvarg),
  88. (pvarg)
  89. )
  90. DELAYOLEAUTAPI_HR( VariantInit,
  91. (VARIANTARG* pvarg),
  92. (pvarg)
  93. )
  94. DELAYOLEAUTAPI_HR( VariantCopy,
  95. (VARIANTARG* pvargDest,
  96. VARIANTARG* pvargSrc
  97. ),
  98. (pvargDest, pvargSrc)
  99. )
  100. DELAYOLEAUTAPI_HR( VariantChangeType,
  101. (VARIANTARG* pvargDest,
  102. VARIANTARG* pvargSrc,
  103. USHORT wFlags,
  104. VARTYPE vt
  105. ),
  106. (pvargDest, pvargSrc, wFlags, vt)
  107. )
  108. DELAYOLEAUTAPI_HR( LoadTypeLib,
  109. (const OLECHAR* szFile,
  110. ITypeLib** pptlib
  111. ),
  112. (szFile, pptlib)
  113. )
  114. DELAYOLEAUTAPI_BSTR( SysAllocStringByteLen,
  115. (LPCSTR psz,
  116. UINT len
  117. ),
  118. (psz, len )
  119. )
  120. DELAYOLEAUTAPI_BSTR( SysAllocString,
  121. (const OLECHAR* psz),
  122. (psz)
  123. )
  124. DELAYOLEAUTAPI_UINT( SysStringByteLen,
  125. (BSTR bstr),
  126. (bstr)
  127. )
  128. DELAYOLEAUTAPI_VOID( SysFreeString,
  129. (BSTR bstr),
  130. (bstr)
  131. )
  132. private:
  133. BOOL _fInited;
  134. HMODULE _hMod;
  135. };
  136. //+---------------------------------------------------------------------------
  137. //
  138. // Method: COleAutDll::COleAutDll
  139. //
  140. // Synopsis:
  141. //
  142. // History: 05-15-97 DanpoZ (Danpo Zhang) Created
  143. //
  144. // Notes:
  145. //
  146. //----------------------------------------------------------------------------
  147. inline
  148. COleAutDll::COleAutDll()
  149. {
  150. _fInited = FALSE;
  151. _hMod = NULL;
  152. }
  153. //+---------------------------------------------------------------------------
  154. //
  155. // Method: COleAutDll::~COleAutDll
  156. //
  157. // Synopsis:
  158. //
  159. // History: 05-15-97 DanpoZ (Danpo Zhang) Created
  160. //
  161. // Notes:
  162. //
  163. //----------------------------------------------------------------------------
  164. inline
  165. COleAutDll::~COleAutDll()
  166. {
  167. if( _fInited)
  168. FreeLibrary(_hMod);
  169. }
  170. //+---------------------------------------------------------------------------
  171. //
  172. // Method: COleAutDll::Init
  173. //
  174. // Synopsis:
  175. //
  176. // History: 05-15-97 DanpoZ (Danpo Zhang) Created
  177. //
  178. // Notes:
  179. //
  180. //----------------------------------------------------------------------------
  181. inline
  182. HRESULT COleAutDll::Init()
  183. {
  184. HRESULT hr = NOERROR;
  185. if( !_fInited )
  186. {
  187. _hMod = LoadLibrary("oleaut32.dll");
  188. if( !_hMod )
  189. hr = HRESULT_FROM_WIN32(GetLastError());
  190. else
  191. {
  192. #define CHECKOAUTAPI(_fn) \
  193. *(FARPROC*)&(_pfn##_fn) = GetProcAddress(_hMod, #_fn); \
  194. if( !(_pfn##_fn)) hr = E_UNEXPECTED;
  195. CHECKOAUTAPI(VariantClear);
  196. CHECKOAUTAPI(VariantInit);
  197. CHECKOAUTAPI(VariantCopy);
  198. CHECKOAUTAPI(VariantChangeType);
  199. CHECKOAUTAPI(SysAllocStringByteLen);
  200. CHECKOAUTAPI(SysAllocString);
  201. CHECKOAUTAPI(SysStringByteLen);
  202. CHECKOAUTAPI(SysFreeString);
  203. CHECKOAUTAPI(LoadTypeLib);
  204. }
  205. if( hr == NOERROR )
  206. _fInited = TRUE;
  207. }
  208. return hr;
  209. }
  210. #endif