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
00041
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060 #ifndef COMSTL_INCL_H_COMSTL
00061 # include "comstl.h"
00062 #endif
00063 #ifndef COMSTL_INCL_H_COMSTL_REFCOUNT_FUNCTIONS
00064 # include "comstl_refcount_functions.h"
00065 #endif
00066 #ifndef COMSTL_INCL_H_COMSTL_OLESTRING_FUNCTIONS
00067 # include "comstl_olestring_functions.h"
00068 #endif
00069 #ifndef STLSOFT_INCL_H_STLSOFT_SAP_CAST
00070 # include "stlsoft_sap_cast.h"
00071 #endif
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 #ifndef _COMSTL_NO_NAMESPACE
00091 # if defined(_STLSOFT_NO_NAMESPACE) || \
00092 defined(__STLSOFT_DOCUMENTATION_SKIP_SECTION)
00093
00094 namespace comstl
00095 {
00096 # else
00097
00098
00099 namespace stlsoft
00100 {
00101
00102 namespace comstl_project
00103 {
00104
00105 # endif
00106 #endif
00107
00108
00109
00114
00115
00116
00117
00118
00120 struct GUID_policy
00121 {
00122 public:
00123 typedef GUID value_type;
00124
00125 public:
00127 static void init(value_type *)
00128 {}
00130 static void copy(value_type *dest, value_type const *src)
00131 {
00132 *dest = *src;
00133 }
00135 static void clear(value_type *)
00136 {}
00137 };
00138
00139
00141 struct BSTR_policy
00142 {
00143 public:
00144 typedef BSTR value_type;
00145
00146 public:
00148 static void init(value_type *p)
00149 {
00150 *p = NULL;
00151 }
00153 static void copy(value_type *dest, value_type const *src)
00154 {
00155 *dest = ::SysAllocString(*src);
00156 }
00158 static void clear(value_type *p)
00159 {
00160 ::SysFreeString(*p);
00161 }
00162 };
00163
00164
00166 struct LPOLESTR_policy
00167 {
00168 public:
00169 typedef LPOLESTR value_type;
00170
00171 public:
00173 static void init(value_type *p)
00174 {
00175 *p = NULL;
00176 }
00178 static void copy(value_type *dest, value_type const *src)
00179 {
00180 *dest = olestring_dup(*src);
00181 }
00183 static void clear(value_type *p)
00184 {
00185 olestring_destroy(*p);
00186 }
00187 };
00188
00189
00191 struct VARIANT_policy
00192 {
00193 public:
00194 typedef VARIANT value_type;
00195
00196 public:
00198 static void init(value_type *p)
00199 {
00200 ::VariantInit(p);
00201 }
00203 static void copy(value_type *dest, value_type const *src)
00204 {
00205 ::VariantCopy(dest, const_cast<VARIANT*>(src));
00206 }
00208 static void clear(value_type *p)
00209 {
00210 ::VariantClear(p);
00211 }
00212 };
00213
00214
00218 template <ss_typename_param_k I>
00219 struct interface_policy
00220 {
00221 public:
00222 typedef I interface_type;
00223 typedef interface_type *value_type;
00224
00225 public:
00227 static void init(value_type *p)
00228 {
00229 *p = NULL;
00230 }
00232 static void copy(value_type *dest, value_type const *src)
00233 {
00234 *dest = *src;
00235 safe_addref(*dest);
00236 }
00238 static void clear(value_type *p)
00239 {
00240 release_set_null(*p);
00241 }
00242 };
00243
00244
00246 struct LPUNKNOWN_policy
00247 {
00248 public:
00249 typedef LPUNKNOWN value_type;
00250
00251 public:
00253 static void init(value_type *p)
00254 {
00255 *p = NULL;
00256 }
00258 static void copy(value_type *dest, value_type const *src)
00259 {
00260 *dest = *src;
00261 safe_addref(*dest);
00262 }
00264 static void clear(value_type *p)
00265 {
00266 release_set_null(*p);
00267 }
00268 };
00269
00270
00272 struct STATSTG_policy
00273 {
00274 public:
00275 typedef STATSTG value_type;
00276
00277 public:
00279 static void init(value_type *p)
00280 {
00281 p->pwcsName = NULL;
00282 }
00284 static void copy(value_type *dest, value_type const *src)
00285 {
00286 *dest = *src;
00287 if(src->pwcsName != NULL)
00288 {
00289 dest->pwcsName = olestring_dup(src->pwcsName);
00290 };
00291 }
00293 static void clear(value_type *p)
00294 {
00295 olestring_destroy(p->pwcsName);
00296 }
00297 };
00298
00299
00301 struct FORMATETC_policy
00302 {
00303 public:
00304 typedef FORMATETC value_type;
00305
00306 public:
00308 static void init(value_type *p)
00309 {
00310 p->ptd = NULL;
00311 }
00313 static void copy(value_type *dest, value_type const *src)
00314 {
00315 *dest = *src;
00316 if(dest->ptd != NULL)
00317 {
00318 dest->ptd = static_cast<DVTARGETDEVICE*>(::CoTaskMemAlloc(src->ptd->tdSize));
00319
00320 if(dest->ptd != NULL)
00321 {
00322 BYTE const *src_begin = stlsoft_ns_qual(sap_cast)<BYTE const*>(&src->ptd);
00323 BYTE const *src_end = src_begin + src->ptd->tdSize;
00324 BYTE *dest_begin = stlsoft_ns_qual(sap_cast)<BYTE*>(&dest->ptd);
00325
00326 for(; src_begin != src_end; ++src_begin, ++dest_begin)
00327 {
00328 *dest_begin = *src_begin;
00329 }
00330 }
00331 }
00332 }
00334 static void clear(value_type *p)
00335 {
00336 ::CoTaskMemFree(p->ptd);
00337 }
00338 };
00339
00340
00341
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354 #endif
00355
00356
00357
00358
00359
00360