⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mycom.h

📁 sleuthit-2.09 一个磁盘的工具集
💻 H
字号:
// MyCom.h#ifndef __MYCOM_H#define __MYCOM_H#include "MyWindows.h"#define RINOK(x) { HRESULT __result_ = (x); if(__result_ != S_OK) return __result_; }template <class T>class CMyComPtr{  T* _p;public:  // typedef T _PtrClass;  CMyComPtr() { _p = NULL;}  CMyComPtr(T* p) {if ((_p = p) != NULL) p->AddRef(); }  CMyComPtr(const CMyComPtr<T>& lp)  {    if ((_p = lp._p) != NULL)      _p->AddRef();  }  ~CMyComPtr() { if (_p) _p->Release(); }  void Release() { if (_p) { _p->Release(); _p = NULL; } }  operator T*() const {  return (T*)_p;  }  // T& operator*() const {  return *_p; }  T** operator&() { return &_p; }  T* operator->() const { return _p; }  T* operator=(T* p)   {     if (p != 0)      p->AddRef();    if (_p)       _p->Release();    _p = p;    return p;  }  T* operator=(const CMyComPtr<T>& lp) { return (*this = lp._p); }  bool operator!() const { return (_p == NULL); }  // bool operator==(T* pT) const {  return _p == pT; }  // Compare two objects for equivalence  void Attach(T* p2)  {    Release();    _p = p2;  }  T* Detach()  {    T* pt = _p;    _p = NULL;    return pt;  }  #ifdef _WIN32  HRESULT CoCreateInstance(REFCLSID rclsid, REFIID iid, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)  {    return ::CoCreateInstance(rclsid, pUnkOuter, dwClsContext, iid, (void**)&_p);  }  #endif  /*  HRESULT CoCreateInstance(LPCOLESTR szProgID, LPUNKNOWN pUnkOuter = NULL, DWORD dwClsContext = CLSCTX_ALL)  {    CLSID clsid;    HRESULT hr = CLSIDFromProgID(szProgID, &clsid);    ATLASSERT(_p == NULL);    if (SUCCEEDED(hr))      hr = ::CoCreateInstance(clsid, pUnkOuter, dwClsContext, __uuidof(T), (void**)&_p);    return hr;  }  */  template <class Q>  HRESULT QueryInterface(REFGUID iid, Q** pp) const  {    return _p->QueryInterface(iid, (void**)pp);  }};//////////////////////////////////////////////////////////class CMyComBSTR{public:  BSTR m_str;  CMyComBSTR() { m_str = NULL; }  CMyComBSTR(LPCOLESTR pSrc) {  m_str = ::SysAllocString(pSrc);  }  // CMyComBSTR(int nSize) { m_str = ::SysAllocStringLen(NULL, nSize); }  // CMyComBSTR(int nSize, LPCOLESTR sz) { m_str = ::SysAllocStringLen(sz, nSize);  }  CMyComBSTR(const CMyComBSTR& src) { m_str = src.MyCopy(); }  /*  CMyComBSTR(REFGUID src)  {    LPOLESTR szGuid;    StringFromCLSID(src, &szGuid);    m_str = ::SysAllocString(szGuid);    CoTaskMemFree(szGuid);  }  */  ~CMyComBSTR() { ::SysFreeString(m_str); }  CMyComBSTR& operator=(const CMyComBSTR& src)  {    if (m_str != src.m_str)    {      if (m_str)        ::SysFreeString(m_str);      m_str = src.MyCopy();    }    return *this;  }  CMyComBSTR& operator=(LPCOLESTR pSrc)  {    ::SysFreeString(m_str);    m_str = ::SysAllocString(pSrc);    return *this;  }  unsigned int Length() const { return ::SysStringLen(m_str); }  operator BSTR() const { return m_str; }  BSTR* operator&() { return &m_str; }  BSTR MyCopy() const   {     int byteLen = ::SysStringByteLen(m_str);    BSTR res = ::SysAllocStringByteLen(NULL, byteLen);    memmove(res, m_str, byteLen);    return res;  }  void Attach(BSTR src) {  m_str = src; }  BSTR Detach()  {    BSTR s = m_str;    m_str = NULL;    return s;  }  void Empty()  {    ::SysFreeString(m_str);    m_str = NULL;  }  bool operator!() const {  return (m_str == NULL); }};//////////////////////////////////////////////////////////class CMyUnknownImp{public:  ULONG __m_RefCount;  CMyUnknownImp(): __m_RefCount(0) {}};#define MY_QUERYINTERFACE_BEGIN STDMETHOD(QueryInterface) \    (REFGUID iid, void **outObject) { #define MY_QUERYINTERFACE_ENTRY(i) if (iid == IID_ ## i) \    { *outObject = (void *)(i *)this; AddRef(); return S_OK; }#define MY_QUERYINTERFACE_END return E_NOINTERFACE; }#define MY_ADDREF_RELEASE \STDMETHOD_(ULONG, AddRef)() { return ++__m_RefCount; } \STDMETHOD_(ULONG, Release)() { if (--__m_RefCount != 0)  \  return __m_RefCount; delete this; return 0; }#define MY_UNKNOWN_IMP_SPEC(i) \  MY_QUERYINTERFACE_BEGIN \  i \  MY_QUERYINTERFACE_END \  MY_ADDREF_RELEASE#define MY_UNKNOWN_IMP STDMETHOD(QueryInterface)(REFGUID, void **) { \  MY_QUERYINTERFACE_END \  MY_ADDREF_RELEASE#define MY_UNKNOWN_IMP1(i) MY_UNKNOWN_IMP_SPEC( \  MY_QUERYINTERFACE_ENTRY(i) \  )#define MY_UNKNOWN_IMP2(i1, i2) MY_UNKNOWN_IMP_SPEC( \  MY_QUERYINTERFACE_ENTRY(i1) \  MY_QUERYINTERFACE_ENTRY(i2) \  )#define MY_UNKNOWN_IMP3(i1, i2, i3) MY_UNKNOWN_IMP_SPEC( \  MY_QUERYINTERFACE_ENTRY(i1) \  MY_QUERYINTERFACE_ENTRY(i2) \  MY_QUERYINTERFACE_ENTRY(i3) \  )#define MY_UNKNOWN_IMP4(i1, i2, i3, i4) MY_UNKNOWN_IMP_SPEC( \  MY_QUERYINTERFACE_ENTRY(i1) \  MY_QUERYINTERFACE_ENTRY(i2) \  MY_QUERYINTERFACE_ENTRY(i3) \  MY_QUERYINTERFACE_ENTRY(i4) \  )#define MY_UNKNOWN_IMP5(i1, i2, i3, i4, i5) MY_UNKNOWN_IMP_SPEC( \  MY_QUERYINTERFACE_ENTRY(i1) \  MY_QUERYINTERFACE_ENTRY(i2) \  MY_QUERYINTERFACE_ENTRY(i3) \  MY_QUERYINTERFACE_ENTRY(i4) \  MY_QUERYINTERFACE_ENTRY(i5) \  )#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -