00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00047 #ifndef WINSTL_INCL_WINSTL_SHELL_MEMORY_H_FUNCTIONS
00048 #define WINSTL_INCL_WINSTL_SHELL_MEMORY_H_FUNCTIONS
00049
00050 #ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
00051 # define WINSTL_VER_WINSTL_SHELL_MEMORY_H_FUNCTIONS_MAJOR 6
00052 # define WINSTL_VER_WINSTL_SHELL_MEMORY_H_FUNCTIONS_MINOR 0
00053 # define WINSTL_VER_WINSTL_SHELL_MEMORY_H_FUNCTIONS_REVISION 3
00054 # define WINSTL_VER_WINSTL_SHELL_MEMORY_H_FUNCTIONS_EDIT 53
00055 #endif
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 #ifndef WINSTL_INCL_WINSTL_H_WINSTL
00070 # include <winstl/winstl.h>
00071 #endif
00072
00073 #ifndef STLSOFT_INCL_H_SHLOBJ
00074 # define STLSOFT_INCL_H_SHLOBJ
00075 # include <shlobj.h>
00076 #endif
00077
00078
00079
00080
00081
00082 #if !defined(_WINSTL_NO_NAMESPACE) && \
00083 !defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00084 # if defined(_STLSOFT_NO_NAMESPACE)
00085
00086 namespace winstl
00087 {
00088 # else
00089
00090
00091 namespace stlsoft
00092 {
00093
00094 namespace winstl_project
00095 {
00096
00097 # endif
00098 #endif
00099
00100
00101
00102
00103
00121 STLSOFT_INLINE void *winstl__SHMemAlloc(ws_size_t cb)
00122 {
00123 LPMALLOC lpmalloc;
00124 void *pv;
00125 HRESULT hr = STLSOFT_NS_GLOBAL(SHGetMalloc)(&lpmalloc);
00126
00127 if(SUCCEEDED(hr))
00128 {
00129 pv = WINSTL_ITF_CALL(lpmalloc)->Alloc(WINSTL_ITF_THIS(lpmalloc) cb);
00130 WINSTL_ITF_CALL(lpmalloc)->Release(WINSTL_ITF_THIS0(lpmalloc));
00131
00132 if(NULL == pv)
00133 {
00134 STLSOFT_NS_GLOBAL(SetLastError)(ERROR_NOT_ENOUGH_MEMORY);
00135 }
00136 }
00137 else
00138 {
00139 STLSOFT_NS_GLOBAL(SetLastError)(stlsoft_static_cast(DWORD, hr));
00140 pv = NULL;
00141 }
00142
00143 return pv;
00144 }
00145
00164 STLSOFT_INLINE void winstl__SHMemFree(void *pv)
00165 {
00166 LPMALLOC lpmalloc;
00167 HRESULT hr = STLSOFT_NS_GLOBAL(SHGetMalloc)(&lpmalloc);
00168
00169 if(SUCCEEDED(hr))
00170 {
00171 WINSTL_ITF_CALL(lpmalloc)->Free(WINSTL_ITF_THIS(lpmalloc) pv);
00172 WINSTL_ITF_CALL(lpmalloc)->Release(WINSTL_ITF_THIS0(lpmalloc));
00173 }
00174 else
00175 {
00176 STLSOFT_NS_GLOBAL(SetLastError)(stlsoft_static_cast(DWORD, hr));
00177 }
00178 }
00179
00180 #if defined(STLSOFT_COMPILER_IS_GCC) && \
00181 __GNUC__ < 4 && \
00182 __GNUC_MINOR__ < 3
00183
00184
00185
00186
00187
00188
00189
00190 # undef INTERFACE
00191 # define INTERFACE IMallocGcc32
00192 DECLARE_INTERFACE_(IMallocGcc32,IUnknown)
00193 {
00194 STDMETHOD(QueryInterface)(THIS_ REFIID,PVOID*) PURE;
00195 STDMETHOD_(ULONG,AddRef)(THIS) PURE;
00196 STDMETHOD_(ULONG,Release)(THIS) PURE;
00197 STDMETHOD_(void*,Alloc)(THIS_ ULONG) PURE;
00198 STDMETHOD_(void*,Realloc)(THIS_ void*,ULONG) PURE;
00199 STDMETHOD_(void,Free)(THIS_ void*) PURE;
00200 STDMETHOD_(ULONG,GetSize)(THIS_ void*) PURE;
00201 STDMETHOD_(int,DidAlloc)(THIS_ void*) PURE;
00202 STDMETHOD_(void,HeapMinimize)(THIS) PURE;
00203 };
00204
00205 #endif
00206
00207
00208
00209
00210
00233 STLSOFT_INLINE void *winstl__SHMemRealloc(void *pv, ws_size_t cb)
00234 {
00235 #if defined(STLSOFT_COMPILER_IS_GCC) && \
00236 __GNUC__ < 4 && \
00237 __GNUC_MINOR__ < 3
00238
00239 IMallocGcc32 *lpmalloc;
00240 #else
00241 LPMALLOC lpmalloc;
00242 #endif
00243 void *pvNew;
00244 HRESULT hr = STLSOFT_NS_GLOBAL(SHGetMalloc)(stlsoft_reinterpret_cast(LPMALLOC*, &lpmalloc));
00245
00246 if(SUCCEEDED(hr))
00247 {
00248 pvNew = WINSTL_ITF_CALL(lpmalloc)->Realloc(WINSTL_ITF_THIS(lpmalloc) pv, cb);
00249 WINSTL_ITF_CALL(lpmalloc)->Release(WINSTL_ITF_THIS0(lpmalloc));
00250
00251 if( NULL == pvNew &&
00252 0 != cb &&
00253 NULL != pv)
00254 {
00255 STLSOFT_NS_GLOBAL(SetLastError)(ERROR_NOT_ENOUGH_MEMORY);
00256 }
00257 }
00258 else
00259 {
00260 STLSOFT_NS_GLOBAL(SetLastError)(stlsoft_static_cast(DWORD, hr));
00261 pvNew = NULL;
00262 }
00263
00264 return pvNew;
00265 }
00266
00280 STLSOFT_INLINE ws_size_t winstl__SHMemGetSize(void *pv)
00281 {
00282 LPMALLOC lpmalloc;
00283 ws_size_t ulRet;
00284 HRESULT hr = STLSOFT_NS_GLOBAL(SHGetMalloc)(&lpmalloc);
00285
00286 if(SUCCEEDED(hr))
00287 {
00288 ulRet = WINSTL_ITF_CALL(lpmalloc)->GetSize(WINSTL_ITF_THIS(lpmalloc) pv);
00289 WINSTL_ITF_CALL(lpmalloc)->Release(WINSTL_ITF_THIS0(lpmalloc));
00290 }
00291 else
00292 {
00293 STLSOFT_NS_GLOBAL(SetLastError)(stlsoft_static_cast(DWORD, hr));
00294 ulRet = 0;
00295 }
00296
00297 return ulRet;
00298 }
00299
00316 STLSOFT_INLINE ws_sint_t winstl__SHMemDidAlloc(void *pv)
00317 {
00318 LPMALLOC lpmalloc;
00319 ws_sint_t iRet;
00320 HRESULT hr = STLSOFT_NS_GLOBAL(SHGetMalloc)(&lpmalloc);
00321
00322 if(SUCCEEDED(hr))
00323 {
00324 iRet = WINSTL_ITF_CALL(lpmalloc)->DidAlloc(WINSTL_ITF_THIS(lpmalloc) pv);
00325 WINSTL_ITF_CALL(lpmalloc)->Release(WINSTL_ITF_THIS0(lpmalloc));
00326 }
00327 else
00328 {
00329 STLSOFT_NS_GLOBAL(SetLastError)(stlsoft_static_cast(DWORD, hr));
00330 iRet = -1;
00331 }
00332
00333 return iRet;
00334 }
00335
00347 STLSOFT_INLINE void winstl__SHMemHeapMinimise(void)
00348 {
00349 LPMALLOC lpmalloc;
00350 HRESULT hr = STLSOFT_NS_GLOBAL(SHGetMalloc)(&lpmalloc);
00351
00352 if(SUCCEEDED(hr))
00353 {
00354 WINSTL_ITF_CALL(lpmalloc)->HeapMinimize(WINSTL_ITF_THIS0(lpmalloc));
00355 WINSTL_ITF_CALL(lpmalloc)->Release(WINSTL_ITF_THIS0(lpmalloc));
00356 }
00357 else
00358 {
00359 STLSOFT_NS_GLOBAL(SetLastError)(stlsoft_static_cast(DWORD, hr));
00360 }
00361 }
00362
00363
00364
00365
00366
00367 #ifdef STLSOFT_DOCUMENTATION_SKIP_SECTION
00368 namespace winstl
00369 {
00370 #endif
00371
00372
00373
00374
00375
00376 #ifdef __cplusplus
00377
00388 inline void *SHMemAlloc(ws_size_t cb)
00389 {
00390 return winstl__SHMemAlloc(cb);
00391 }
00392
00401 inline void SHMemFree(void *pv)
00402 {
00403 winstl__SHMemFree(pv);
00404 }
00405
00420 inline void *SHMemRealloc(void *pv, ws_size_t cb)
00421 {
00422 return winstl__SHMemRealloc(pv, cb);
00423 }
00424
00434 inline ws_size_t SHMemGetSize(void *pv)
00435 {
00436 return winstl__SHMemGetSize(pv);
00437 }
00438
00451 inline ws_sint_t SHMemDidAlloc(void *pv)
00452 {
00453 return winstl__SHMemDidAlloc(pv);
00454 }
00455
00462 inline void SHMemHeapMinimise()
00463 {
00464 winstl__SHMemHeapMinimise();
00465 }
00466
00473 inline void SHMemHeapMinimize()
00474 {
00475 winstl__SHMemHeapMinimise();
00476 }
00477
00478 #endif
00479
00480
00481
00482
00483
00484 #ifdef STLSOFT_UNITTEST
00485 # include "./unittest/functions_unittest_.h"
00486 #endif
00487
00488
00489
00490 #ifndef _WINSTL_NO_NAMESPACE
00491 # if defined(_STLSOFT_NO_NAMESPACE) || \
00492 defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
00493 }
00494 # else
00495 }
00496 }
00497 # endif
00498 #endif
00499
00500
00501
00502 #endif
00503
00504