Mobile API Reference  MicroStrategy 2019
Msi_ccomvariant.h
Go to the documentation of this file.
1 // File: ccomvariant.h
2 // Date: 8/28/2001
3 // Author: Yuling Ma
4 //
5 // Copyright (C) 2001 MicroStrategy Incorporated
6 // All rights reserved
7 
8 // This header file is for defining the CComVariant related structures, symbols and functions.
9 // On NT platform, the these structures, symbols and functions are defined in the following
10 // header files: atlbase.h
11 #ifndef _CCOMVARIANT_H_
12 #define _CCOMVARIANT_H_
13 
14 #include "Msi_variant.h"
15 
17 
18 #import "string"
19 #include <sstream>
20 
22 // CComVariant
23 
24 class CComVariant : public tagVARIANT
25 {
26 // Constructors
27 public:
29  {
30  vt = VT_EMPTY;
31  }
33  {
34  Clear();
35  }
36 
37  CComVariant(const VARIANT& varSrc)
38  {
39  vt = VT_EMPTY;
40  InternalCopy(&varSrc);
41  }
42 
43  CComVariant(const CComVariant& varSrc)
44  {
45  vt = VT_EMPTY;
46  InternalCopy(&varSrc);
47  }
48 
49  CComVariant(BSTR bstrSrc)
50  {
51  vt = VT_EMPTY;
52  *this = bstrSrc;
53  }
54 
55 #ifndef NO_WCHAR_SUPPORT
57  {
58  vt = VT_EMPTY;
59  *this = lpszSrc;
60  }
61 #endif
62 
64  {
65  vt = VT_EMPTY;
66  *this = lpszSrc;
67  }
68 
69  CComVariant(bool bSrc)
70  {
71  vt = VT_BOOL;
73  }
74 
75  CComVariant(int nSrc)
76  {
77  vt = VT_I4;
78  lVal = nSrc;
79  }
81  {
82  vt = VT_UI1;
83  bVal = nSrc;
84  }
85  CComVariant(short nSrc)
86  {
87  vt = VT_I2;
88  iVal = nSrc;
89  }
90  CComVariant(long nSrc, VARTYPE vtSrc = VT_I4)
91  {
92  ATLASSERT(vtSrc == VT_I4 || vtSrc == VT_ERROR);
93  vt = vtSrc;
94  lVal = nSrc;
95  }
96  CComVariant(float fltSrc)
97  {
98  vt = VT_R4;
99  fltVal = fltSrc;
100  }
101  CComVariant(double dblSrc)
102  {
103  vt = VT_R8;
104  dblVal = dblSrc;
105  }
107  {
108  vt = VT_CY;
109  cyVal._Parts.Hi = cySrc._Parts.Hi;
110  cyVal._Parts.Lo = cySrc._Parts.Lo;
111  }
113  {
114  vt = VT_DISPATCH;
115  pdispVal = pSrc;
116  // Need to AddRef as VariantClear will Release
117  if (pdispVal != NULL)
118  pdispVal->AddRef();
119  }
121  {
122  vt = VT_UNKNOWN;
123  punkVal = pSrc;
124  // Need to AddRef as VariantClear will Release
125  if (punkVal != NULL)
126  punkVal->AddRef();
127  }
128  CComVariant(const SAFEARRAY* pSrc)
129  {
130  VARTYPE lvt;
131  SafeArrayGetVartype((SAFEARRAY*)pSrc,&lvt);
132  // Gopal - Oct 15 2007
133  // Using VT_ARRAY and not VT_SAFEARRAY to conform with MSDN documentation
134  // of the original constructor in NTCOM
135  vt = VT_EMPTY;
136  VARIANT lTempVar;
137  lTempVar.vt = VT_ARRAY | lvt;
138  lTempVar.parray = (SAFEARRAY*)pSrc;
139  InternalCopy(&lTempVar);
140  }
141 
142 // Assignment Operators
143 public:
145  {
146  InternalCopy(&varSrc);
147  return *this;
148  }
149  CComVariant& operator=(const VARIANT& varSrc)
150  {
151  InternalCopy(&varSrc);
152  return *this;
153  }
154 
156  {
157  InternalClear();
158  vt = VT_BSTR;
159  bstrVal = ::SysAllocString(bstrSrc);
160  if (bstrVal == NULL && bstrSrc != NULL)
161  {
162  vt = VT_ERROR;
164  }
165  return *this;
166  }
167 
169  {
170  InternalClear();
171  vt = VT_BSTR;
172  bstrVal = ::SysAllocString(lpszSrc);
173 
174  if (bstrVal == NULL && lpszSrc != NULL)
175  {
176  vt = VT_ERROR;
178  }
179  return *this;
180  }
181 
182 #ifndef NO_WCHAR_SUPPORT
183  CComVariant& operator=(LPCSTR lpszSrc) //Drop the ReturnWString support and replace our own logic here
184  {
185  //const MBase::ReturnWString lStr(MBase::MultiByteToWideChar(lpszSrc));
186  /* Seems what we need here is nothing but a wchar_t string, so.... */
187  std::string lInpuStr = lpszSrc;
188  const size_t lSize = lInpuStr.size();
189  wchar_t lBuffer[lSize + 1];
190 
191  //size_t mbstowcs(wchar_t * __restrict , const char * __restrict, size_t);
192  mbstowcs(lBuffer, lInpuStr.c_str(), lSize + 1);
193  std::wstring lStr(lBuffer);
194 
195  *this = lStr.c_str();
196  return *this;
197  }
198 #endif
199  CComVariant& operator=(bool bSrc)
200  {
201  if (vt != VT_BOOL)
202  {
203  InternalClear();
204  vt = VT_BOOL;
205  }
207  return *this;
208  }
209 
211  {
212  if (vt != VT_I4)
213  {
214  InternalClear();
215  vt = VT_I4;
216  }
217  lVal = nSrc;
218 
219  return *this;
220  }
221 
223  {
224  if (vt != VT_UI1)
225  {
226  InternalClear();
227  vt = VT_UI1;
228  }
229  bVal = nSrc;
230  return *this;
231  }
232 
233  CComVariant& operator=(short nSrc)
234  {
235  if (vt != VT_I2)
236  {
237  InternalClear();
238  vt = VT_I2;
239  }
240  iVal = nSrc;
241  return *this;
242  }
243 
244  CComVariant& operator=(long nSrc)
245  {
246  if (vt != VT_I4)
247  {
248  InternalClear();
249  vt = VT_I4;
250  }
251  lVal = nSrc;
252  return *this;
253  }
254 
255  CComVariant& operator=(float fltSrc)
256  {
257  if (vt != VT_R4)
258  {
259  InternalClear();
260  vt = VT_R4;
261  }
262  fltVal = fltSrc;
263  return *this;
264  }
265 
266  CComVariant& operator=(double dblSrc)
267  {
268  if (vt != VT_R8)
269  {
270  InternalClear();
271  vt = VT_R8;
272  }
273  dblVal = dblSrc;
274  return *this;
275  }
276 
278  {
279  if (vt != VT_CY)
280  {
281  InternalClear();
282  vt = VT_CY;
283  }
284  cyVal._Parts.Hi = cySrc._Parts.Hi;
285  cyVal._Parts.Lo = cySrc._Parts.Lo;
286  return *this;
287  }
288 
290  {
291  InternalClear();
292  vt = VT_DISPATCH;
293  pdispVal = pSrc;
294  // Need to AddRef as VariantClear will Release
295  if (pdispVal != NULL)
296  pdispVal->AddRef();
297  return *this;
298  }
299 
301  {
302  InternalClear();
303  vt = VT_UNKNOWN;
304  punkVal = pSrc;
305 
306  // Need to AddRef as VariantClear will Release
307  if (punkVal != NULL)
308  punkVal->AddRef();
309  return *this;
310  }
311 
312 
313 // Comparison Operators
314 public:
315  bool operator==(const VARIANT& varSrc) const
316  {
317  if (this == &varSrc)
318  return true;
319 
320  // Variants not equal if types don't match
321  if (vt != varSrc.vt)
322  return false;
323 
324  // Check type specific values
325  switch (vt)
326  {
327  case VT_EMPTY:
328  case VT_NULL:
329  return true;
330 
331  case VT_BOOL:
332  return boolVal == varSrc.boolVal;
333 
334  case VT_UI1:
335  return bVal == varSrc.bVal;
336 
337  case VT_I2:
338  return iVal == varSrc.iVal;
339 
340  case VT_I4:
341  return lVal == varSrc.lVal;
342 
343  case VT_R4:
344  return fltVal == varSrc.fltVal;
345 
346  case VT_R8:
347  return dblVal == varSrc.dblVal;
348 
349  case VT_BSTR:
350  return (::SysStringByteLen(bstrVal) == ::SysStringByteLen(varSrc.bstrVal)) &&
351  (::memcmp(bstrVal, varSrc.bstrVal, ::SysStringByteLen(bstrVal)) == 0);
352 
353  case VT_ERROR:
354  return scode == varSrc.scode;
355 
356  case VT_DISPATCH:
357  return pdispVal == varSrc.pdispVal;
358 
359  case VT_UNKNOWN:
360  return punkVal == varSrc.punkVal;
361  // weilin 2016/10/21
362  case VT_DATE:
363  return date == varSrc.date;
364 
365  default:
366  ATLASSERT(false);
367  // fall through
368  }
369 
370  return false;
371  }
372  bool operator!=(const VARIANT& varSrc) const {return !operator==(varSrc);}
373 
374  bool operator<(const VARIANT& varSrc) const {return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, LOCALE_USER_DEFAULT, 0)==VARCMP_LT;}
375  bool operator>(const VARIANT& varSrc) const {return VarCmp((VARIANT*)this, (VARIANT*)&varSrc, LOCALE_USER_DEFAULT, 0)==VARCMP_GT;}
376 
377 // Operations
378 public:
380  HRESULT Copy(const VARIANT* pSrc) { return ::VariantCopy(this, const_cast<VARIANT*>(pSrc)); }
382  {
383  // Clear out the variant
384  HRESULT hr = Clear();
385  if (!FAILED(hr))
386  {
387  // Copy the contents and give control to CComVariant
388  memmove(this, pSrc, sizeof(VARIANT));
389  pSrc->vt = VT_EMPTY;
390  hr = S_OK;
391  }
392  return hr;
393  }
394 
396  {
397  // Clear out the variant
398  HRESULT hr = ::VariantClear(pDest);
399  if (!FAILED(hr))
400  {
401  // Copy the contents and remove control from CComVariant
402  memmove(pDest, this, sizeof(VARIANT));
403  vt = VT_EMPTY;
404  hr = S_OK;
405  }
406  return hr;
407  }
408 
409  HRESULT ChangeType(VARTYPE vtNew, const VARIANT* pSrc = NULL)
410  {
411  VARIANT* pVar = const_cast<VARIANT*>(pSrc);
412  // Convert in place if pSrc is NULL
413  if (pVar == NULL)
414  pVar = this;
415  // Do nothing if doing in place convert and vts not different
416  return ::VariantChangeType(this, pVar, 0, vtNew);
417  }
418 
419  HRESULT WriteToStream(IStream* pStream);
420  HRESULT ReadFromStream(IStream* pStream);
421 
422 // Implementation
423 public:
425  {
426  HRESULT hr = Clear();
427  ATLASSERT(SUCCEEDED(hr));
428  if (FAILED(hr))
429  {
430  vt = VT_ERROR;
431  scode = hr;
432  }
433  return hr;
434  }
435 
436  void InternalCopy(const VARIANT* pSrc)
437  {
438  HRESULT hr = Copy(pSrc);
439  if (FAILED(hr))
440  {
441  vt = VT_ERROR;
442  scode = hr;
443  }
444  }
445 
446  std::string ToString()
447  {
448  std::stringstream oss;
449  oss.str("");
450  std::string lstring = "";
451  switch (vt)
452  {
453  case VT_I4:
454  {
455  oss<<lVal;
456  lstring = oss.str();
457  break;
458  }
459  case VT_I2:
460  {
461  oss<<iVal;
462  lstring = oss.str();
463  break;
464  }
465  case VT_R8:
466  {
467  oss<<dblVal;
468  lstring = oss.str();
469  break;
470  }
471  case VT_BOOL:
472  {
473  if (boolVal==VARIANT_TRUE)
474  lstring = "1";
475  else
476  lstring = "0";
477  break;
478  }
479  case VT_BSTR:
480  {
481 #ifndef __ANDROID__
482  size_t size = wcslen(bstrVal);
483  char* lpText = (char*)malloc(wcslen(bstrVal) + 1);
484  wcstombs(lpText, bstrVal, size + 1);
485 #else
486  size_t size = strlen(bstrVal);
487  char* lpText = (char*)malloc(size+1);
488  std::string lstrVal = bstrVal;
489  strncpy(lpText, lstrVal.c_str(), size);
490  //TODO:
491  //int size = wcslen(bstrVal);
492  //char* lpText = (char*)malloc(wcslen(bstrVal) + 1);
493  //wcstombs(lpText, bstrVal, size + 1);
494 #endif
495  lstring = lpText;
496  free(lpText);//xiazhou, 969563, fix memory leak;
497  break;
498  }
499  default:
500  break;
501  }
502  return lstring;
503  }
504 };
505 
506 /* unfinished
507 inline HRESULT CComVariant::WriteToStream(IStream* pStream)
508 {
509  HRESULT hr = pStream->Write(&vt, sizeof(VARTYPE), NULL);
510  if (FAILED(hr))
511  return hr;
512 
513  int cbWrite = 0;
514  switch (vt)
515  {
516  case VT_UNKNOWN:
517  case VT_DISPATCH:
518  {
519  CComPtr<IPersistStream> spStream;
520  if (punkVal != NULL)
521  {
522  hr = punkVal->QueryInterface(IID_IPersistStream, (void**)&spStream);
523  if (FAILED(hr))
524  return hr;
525  }
526  if (spStream != NULL)
527  return OleSaveToStream(spStream, pStream);
528  else
529  return WriteClassStm(pStream, CLSID_NULL);
530  }
531  case VT_UI1:
532  case VT_I1:
533  cbWrite = sizeof(BYTE);
534  break;
535  case VT_I2:
536  case VT_UI2:
537  case VT_BOOL:
538  cbWrite = sizeof(short);
539  break;
540  case VT_I4:
541  case VT_UI4:
542  case VT_R4:
543  case VT_INT:
544  case VT_UINT:
545  case VT_ERROR:
546  cbWrite = sizeof(long);
547  break;
548  case VT_R8:
549  case VT_CY:
550  case VT_DATE:
551  cbWrite = sizeof(double);
552  break;
553  default:
554  break;
555  }
556  if (cbWrite != 0)
557  return pStream->Write((void*) &bVal, cbWrite, NULL);
558 
559  CComBSTR bstrWrite;
560  CComVariant varBSTR;
561  if (vt != VT_BSTR)
562  {
563  hr = VariantChangeType(&varBSTR, this, VARIANT_NOVALUEPROP, VT_BSTR);
564  if (FAILED(hr))
565  return hr;
566  bstrWrite = varBSTR.bstrVal;
567  }
568  else
569  bstrWrite = bstrVal;
570 
571  return bstrWrite.WriteToStream(pStream);
572 }
573 
574 inline HRESULT CComVariant::ReadFromStream(IStream* pStream)
575 {
576  ATLASSERT(pStream != NULL);
577  HRESULT hr;
578  hr = VariantClear(this);
579  if (FAILED(hr))
580  return hr;
581  VARTYPE vtRead;
582  hr = pStream->Read(&vtRead, sizeof(VARTYPE), NULL);
583  if (hr == S_FALSE)
584  hr = E_FAIL;
585  if (FAILED(hr))
586  return hr;
587 
588  vt = vtRead;
589  int cbRead = 0;
590  switch (vtRead)
591  {
592  case VT_UNKNOWN:
593  case VT_DISPATCH:
594  {
595  punkVal = NULL;
596  hr = OleLoadFromStream(pStream,
597  (vtRead == VT_UNKNOWN) ? IID_IUnknown : IID_IDispatch,
598  (void**)&punkVal);
599  if (hr == REGDB_E_CLASSNOTREG)
600  hr = S_OK;
601  return S_OK;
602  }
603  case VT_UI1:
604  case VT_I1:
605  cbRead = sizeof(BYTE);
606  break;
607  case VT_I2:
608  case VT_UI2:
609  case VT_BOOL:
610  cbRead = sizeof(short);
611  break;
612  case VT_I4:
613  case VT_UI4:
614  case VT_R4:
615  case VT_INT:
616  case VT_UINT:
617  case VT_ERROR:
618  cbRead = sizeof(long);
619  break;
620  case VT_R8:
621  case VT_CY:
622  case VT_DATE:
623  cbRead = sizeof(double);
624  break;
625  default:
626  break;
627  }
628  if (cbRead != 0)
629  {
630  hr = pStream->Read((void*) &bVal, cbRead, NULL);
631  if (hr == S_FALSE)
632  hr = E_FAIL;
633  return hr;
634  }
635  CComBSTR bstrRead;
636 
637  hr = bstrRead.ReadFromStream(pStream);
638  if (FAILED(hr))
639  return hr;
640  vt = VT_BSTR;
641  bstrVal = bstrRead.Detach();
642  if (vtRead != VT_BSTR)
643  hr = ChangeType(vtRead);
644  return hr;
645 }
646 */
647 
648 #endif /* _CCOMVARIANT_H_ */
649 
Definition: Msi_variant.h:90
CComVariant & operator=(LPCSTR lpszSrc)
Definition: Msi_ccomvariant.h:183
IUnknown FAR * punkVal
Definition: Msi_variant.h:165
CComVariant(BSTR bstrSrc)
Definition: Msi_ccomvariant.h:49
Definition: Msi_variant.h:100
Definition: Msi_variant.h:91
OLECHAR __RPC_FAR * BSTR
Definition: PDCwtypes.h:401
CComVariant & operator=(double dblSrc)
Definition: Msi_ccomvariant.h:266
CComVariant & operator=(const VARIANT &varSrc)
Definition: Msi_ccomvariant.h:149
HRESULT Attach(VARIANT *pSrc)
Definition: Msi_ccomvariant.h:381
Definition: Msi_variant.h:98
WINOLEAUTAPI DLL_MSICOM_EXIM VariantClear(VARIANTARG *pvarg)
HRESULT Detach(VARIANT *pDest)
Definition: Msi_ccomvariant.h:395
CComVariant & operator=(IDispatch *pSrc)
Definition: Msi_ccomvariant.h:289
SHORT iVal
Definition: Msi_variant.h:154
LONG lVal
Definition: Msi_variant.h:155
bool operator!=(const VARIANT &varSrc) const
Definition: Msi_ccomvariant.h:372
CComVariant & operator=(int nSrc)
Definition: Msi_ccomvariant.h:210
unsigned char BYTE
Definition: PDCwtypes.h:108
std::string ToString()
Definition: Msi_ccomvariant.h:446
bool operator==(const VARIANT &varSrc) const
Definition: Msi_ccomvariant.h:315
unsigned long Lo
Definition: PDCwtypes.h:263
~CComVariant()
Definition: Msi_ccomvariant.h:32
long HRESULT
Definition: FragmentedString.h:20
#define VARCMP_GT
Definition: Msi_variant.h:229
WINOLEAUTAPI DLL_MSICOM_EXIM VariantCopy(VARIANTARG *pvargDest, VARIANTARG *pvargSrc)
Definition: Msi_variant.h:133
CComVariant(LPCSTR lpszSrc)
Definition: Msi_ccomvariant.h:63
#define ATLASSERT(expr)
Definition: Msi_atldef.h:18
CComVariant(bool bSrc)
Definition: Msi_ccomvariant.h:69
#define VARCMP_LT
Definition: Msi_variant.h:227
Definition: Msi_variant.h:94
CComVariant(const SAFEARRAY *pSrc)
Definition: Msi_ccomvariant.h:128
Definition: Msi_variant.h:106
WINOLEAUTAPI DLL_MSICOM_EXIM VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvarSrc, USHORT wFlags, VARTYPE vt)
CComVariant & operator=(bool bSrc)
Definition: Msi_ccomvariant.h:199
CComVariant(double dblSrc)
Definition: Msi_ccomvariant.h:101
CComVariant(CY cySrc)
Definition: Msi_ccomvariant.h:106
unsigned short VARTYPE
Definition: Msi_variant.h:32
#define S_OK
Definition: PDCwinerror.h:31
#define VARIANT_FALSE
Definition: PDCwtypes.h:406
Definition: Msi_variant.h:92
Definition: Msi_objidl.h:80
#define FAILED(Status)
Definition: PDCwinerror.h:47
CComVariant()
Definition: Msi_ccomvariant.h:28
BYTE bVal
Definition: Msi_variant.h:153
#define LOCALE_USER_DEFAULT
Definition: PDCwinnt.h:319
FLOAT fltVal
Definition: Msi_variant.h:157
Definition: Msi_oaidl.h:95
Definition: Msi_variant.h:101
VARTYPE vt
Definition: Msi_variant.h:148
HRESULT Clear()
Definition: Msi_ccomvariant.h:379
void InternalCopy(const VARIANT *pSrc)
Definition: Msi_ccomvariant.h:436
CY cyVal
Definition: Msi_variant.h:161
CComVariant & operator=(IUnknown *pSrc)
Definition: Msi_ccomvariant.h:300
SAFEARRAY FAR * parray
Definition: Msi_variant.h:167
Definition: Msi_variant.h:99
Definition: Msi_variant.h:103
CComVariant(const VARIANT &varSrc)
Definition: Msi_ccomvariant.h:37
#define SUCCEEDED(Status)
Definition: PDCwinerror.h:42
long Hi
Definition: PDCwtypes.h:264
WINOLEAUTAPI DLL_MSICOM_EXIM VarCmp(LPVARIANT left, LPVARIANT right, LCID lcid, DWORD flags)
CComVariant & operator=(long nSrc)
Definition: Msi_ccomvariant.h:244
HRESULT ChangeType(VARTYPE vtNew, const VARIANT *pSrc=NULL)
Definition: Msi_ccomvariant.h:409
CComVariant & operator=(BYTE nSrc)
Definition: Msi_ccomvariant.h:222
const CHAR __RPC_FAR * LPCSTR
Definition: PDCwtypes.h:367
IDispatch FAR * pdispVal
Definition: Msi_variant.h:166
SCODE scode
Definition: Msi_variant.h:160
bool operator<(const VARIANT &varSrc) const
Definition: Msi_ccomvariant.h:374
Definition: Msi_variant.h:97
bool operator>(const VARIANT &varSrc) const
Definition: Msi_ccomvariant.h:375
CComVariant & operator=(CY cySrc)
Definition: Msi_ccomvariant.h:277
CComVariant(float fltSrc)
Definition: Msi_ccomvariant.h:96
#define E_OUTOFMEMORY
Definition: PDCwinerror.h:114
WINOLEAUTAPI DLL_MSICOM_EXIM SafeArrayGetVartype(SAFEARRAY *psa, VARTYPE *pvt)
Definition: Msi_oaidl.h:41
VARIANT_BOOL boolVal
Definition: Msi_variant.h:159
CComVariant & operator=(const CComVariant &varSrc)
Definition: Msi_ccomvariant.h:144
Definition: Msi_variant.h:95
#define VARIANT_TRUE
Definition: PDCwtypes.h:405
CComVariant(BYTE nSrc)
Definition: Msi_ccomvariant.h:80
Definition: Msi_variant.h:147
Definition: Msi_variant.h:96
struct tagCY::@20 _Parts
CComVariant(LPCOLESTR lpszSrc)
Definition: Msi_ccomvariant.h:56
CComVariant(IUnknown *pSrc)
Definition: Msi_ccomvariant.h:120
Definition: Msi_variant.h:93
Definition: Msi_ccomvariant.h:24
HRESULT WriteToStream(IStream *pStream)
virtual ULONG STDMETHODCALLTYPE AddRef(void)=0
HRESULT Copy(const VARIANT *pSrc)
Definition: Msi_ccomvariant.h:380
HRESULT ReadFromStream(IStream *pStream)
HRESULT InternalClear()
Definition: Msi_ccomvariant.h:424
const OLECHAR __RPC_FAR * LPCOLESTR
Definition: PDCwtypes.h:394
CComVariant & operator=(float fltSrc)
Definition: Msi_ccomvariant.h:255
CComVariant & operator=(BSTR bstrSrc)
Definition: Msi_ccomvariant.h:155
CComVariant(int nSrc)
Definition: Msi_ccomvariant.h:75
CComVariant & operator=(LPCOLESTR lpszSrc)
Definition: Msi_ccomvariant.h:168
CComVariant(short nSrc)
Definition: Msi_ccomvariant.h:85
DOUBLE dblVal
Definition: Msi_variant.h:158
Definition: Msi_oaidl.h:510
#define NULL
Definition: Null.h:10
CComVariant(long nSrc, VARTYPE vtSrc=VT_I4)
Definition: Msi_ccomvariant.h:90
CComVariant(IDispatch *pSrc)
Definition: Msi_ccomvariant.h:112
DATE date
Definition: Msi_variant.h:162
Definition: PDCwtypes.h:261
CComVariant(const CComVariant &varSrc)
Definition: Msi_ccomvariant.h:43
CComVariant & operator=(short nSrc)
Definition: Msi_ccomvariant.h:233
BSTR bstrVal
Definition: Msi_variant.h:163