📄 atlcom.h
字号:
CComVariant var;
var.vt = pMap[i].vt;
// If raw entry skip it - we don't handle it for property bags just yet
if (pMap[i].dwSizeData != 0)
{
void* pData = (void*) (pMap[i].dwOffsetData + (DWORD_PTR)pThis);
HRESULT hr = pPropBag->Read(pMap[i].szDesc, &var, pErrorLog);
if (SUCCEEDED(hr))
{
// check the type - we only deal with limited set
switch (pMap[i].vt)
{
case VT_UI1:
case VT_I1:
*((BYTE*)pData) = var.bVal;
break;
case VT_BOOL:
*((VARIANT_BOOL*)pData) = var.boolVal;
break;
case VT_UI2:
*((short*)pData) = var.iVal;
break;
case VT_UI4:
case VT_INT:
case VT_UINT:
*((long*)pData) = var.lVal;
break;
}
}
continue;
}
if (pMap[i].piidDispatch != piidOld)
{
pDispatch.Release();
if (FAILED(pUnk->QueryInterface(*pMap[i].piidDispatch, (void**)&pDispatch)))
{
ATLTRACE2(atlTraceCOM, 0, _T("Failed to get a dispatch pointer for property #%i\n"), i);
return E_FAIL;
}
piidOld = pMap[i].piidDispatch;
}
if (FAILED(CComDispatchDriver::GetProperty(pDispatch, pMap[i].dispid, &var)))
{
ATLTRACE2(atlTraceCOM, 0, _T("Invoked failed on DISPID %x\n"), pMap[i].dispid);
return E_FAIL;
}
HRESULT hr = pPropBag->Read(pMap[i].szDesc, &var, pErrorLog);
if (FAILED(hr))
{
if (hr == E_INVALIDARG)
{
ATLTRACE2(atlTraceCOM, 0, _T("Property %s not in Bag\n"), OLE2CT(pMap[i].szDesc));
}
else
{
// Many containers return different ERROR values for Member not found
ATLTRACE2(atlTraceCOM, 0, _T("Error attempting to read Property %s from PropertyBag \n"), OLE2CT(pMap[i].szDesc));
}
continue;
}
if (FAILED(CComDispatchDriver::PutProperty(pDispatch, pMap[i].dispid, &var)))
{
ATLTRACE2(atlTraceCOM, 0, _T("Invoked failed on DISPID %x\n"), pMap[i].dispid);
return E_FAIL;
}
}
return S_OK;
}
#endif //_ATL_DLL
#ifdef _ATL_DLL
ATLAPI AtlIPersistPropertyBag_Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties, ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk);
#else
ATLINLINE ATLAPI AtlIPersistPropertyBag_Save(LPPROPERTYBAG pPropBag,
BOOL /* fClearDirty */, BOOL /* fSaveAllProperties */,
ATL_PROPMAP_ENTRY* pMap, void* pThis, IUnknown* pUnk)
{
if (pPropBag == NULL)
{
ATLTRACE2(atlTraceCOM, 0, _T("PropBag pointer passed in was invalid\n"));
return E_POINTER;
}
CComPtr<IDispatch> pDispatch;
const IID* piidOld = NULL;
for (int i = 0; pMap[i].pclsidPropPage != NULL; i++)
{
if (pMap[i].szDesc == NULL)
continue;
CComVariant var;
// If raw entry skip it - we don't handle it for property bags just yet
if (pMap[i].dwSizeData != 0)
{
void* pData = (void*) (pMap[i].dwOffsetData + (DWORD_PTR)pThis);
// check the type - we only deal with limited set
bool bTypeOK = false;
switch (pMap[i].vt)
{
case VT_UI1:
case VT_I1:
var.bVal = *((BYTE*)pData);
bTypeOK = true;
break;
case VT_BOOL:
var.boolVal = *((VARIANT_BOOL*)pData);
bTypeOK = true;
break;
case VT_UI2:
var.iVal = *((short*)pData);
bTypeOK = true;
break;
case VT_UI4:
case VT_INT:
case VT_UINT:
var.lVal = *((long*)pData);
bTypeOK = true;
break;
}
if (bTypeOK)
{
var.vt = pMap[i].vt;
HRESULT hr = pPropBag->Write(pMap[i].szDesc, &var);
if (FAILED(hr))
return hr;
}
continue;
}
if (pMap[i].piidDispatch != piidOld)
{
pDispatch.Release();
if (FAILED(pUnk->QueryInterface(*pMap[i].piidDispatch, (void**)&pDispatch)))
{
ATLTRACE2(atlTraceCOM, 0, _T("Failed to get a dispatch pointer for property #%i\n"), i);
return E_FAIL;
}
piidOld = pMap[i].piidDispatch;
}
if (FAILED(CComDispatchDriver::GetProperty(pDispatch, pMap[i].dispid, &var)))
{
ATLTRACE2(atlTraceCOM, 0, _T("Invoked failed on DISPID %x\n"), pMap[i].dispid);
return E_FAIL;
}
if (var.vt == VT_UNKNOWN || var.vt == VT_DISPATCH)
{
if (var.punkVal == NULL)
{
ATLTRACE2(atlTraceCOM, 0, _T("Warning skipping empty IUnknown in Save\n"));
continue;
}
}
HRESULT hr = pPropBag->Write(pMap[i].szDesc, &var);
if (FAILED(hr))
return hr;
}
return S_OK;
}
#endif //_ATL_DLL
//////////////////////////////////////////////////////////////////////////////
// IPersistStreamInitImpl
template <class T>
class ATL_NO_VTABLE IPersistStreamInitImpl : public IPersistStreamInit
{
public:
// IPersist
STDMETHOD(GetClassID)(CLSID *pClassID)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStreamInitImpl::GetClassID\n"));
*pClassID = T::GetObjectCLSID();
return S_OK;
}
// IPersistStream
STDMETHOD(IsDirty)()
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStreamInitImpl::IsDirty\n"));
T* pT = static_cast<T*>(this);
return (pT->m_bRequiresSave) ? S_OK : S_FALSE;
}
STDMETHOD(Load)(LPSTREAM pStm)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStreamInitImpl::Load\n"));
T* pT = static_cast<T*>(this);
return pT->IPersistStreamInit_Load(pStm, T::GetPropertyMap());
}
STDMETHOD(Save)(LPSTREAM pStm, BOOL fClearDirty)
{
T* pT = static_cast<T*>(this);
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStreamInitImpl::Save\n"));
return pT->IPersistStreamInit_Save(pStm, fClearDirty, T::GetPropertyMap());
}
STDMETHOD(GetSizeMax)(ULARGE_INTEGER FAR* /* pcbSize */)
{
ATLTRACENOTIMPL(_T("IPersistStreamInitImpl::GetSizeMax"));
}
// IPersistStreamInit
STDMETHOD(InitNew)()
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStreamInitImpl::InitNew\n"));
return S_OK;
}
HRESULT IPersistStreamInit_Load(LPSTREAM pStm, ATL_PROPMAP_ENTRY* pMap)
{
T* pT = static_cast<T*>(this);
HRESULT hr = AtlIPersistStreamInit_Load(pStm, pMap, pT, pT->GetUnknown());
if (SUCCEEDED(hr))
pT->m_bRequiresSave = FALSE;
return hr;
}
HRESULT IPersistStreamInit_Save(LPSTREAM pStm, BOOL fClearDirty, ATL_PROPMAP_ENTRY* pMap)
{
T* pT = static_cast<T*>(this);
return AtlIPersistStreamInit_Save(pStm, fClearDirty, pMap, pT, pT->GetUnknown());
}
};
//////////////////////////////////////////////////////////////////////////////
// IPersistStorageImpl
template <class T>
class ATL_NO_VTABLE IPersistStorageImpl : public IPersistStorage
{
public:
// IPersist
STDMETHOD(GetClassID)(CLSID *pClassID)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStorageImpl::GetClassID\n"));
*pClassID = T::GetObjectCLSID();
return S_OK;
}
// IPersistStorage
STDMETHOD(IsDirty)(void)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStorageImpl::IsDirty\n"));
CComPtr<IPersistStreamInit> p;
p.p = IPSI_GetIPersistStreamInit();
return (p != NULL) ? p->IsDirty() : E_FAIL;
}
STDMETHOD(InitNew)(IStorage*)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStorageImpl::InitNew\n"));
CComPtr<IPersistStreamInit> p;
p.p = IPSI_GetIPersistStreamInit();
return (p != NULL) ? p->InitNew() : E_FAIL;
}
STDMETHOD(Load)(IStorage* pStorage)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStorageImpl::Load\n"));
CComPtr<IPersistStreamInit> p;
p.p = IPSI_GetIPersistStreamInit();
HRESULT hr = E_FAIL;
if (p != NULL)
{
CComPtr<IStream> spStream;
hr = pStorage->OpenStream(OLESTR("Contents"), NULL,
STGM_DIRECT | STGM_SHARE_EXCLUSIVE, 0, &spStream);
if (SUCCEEDED(hr))
hr = p->Load(spStream);
}
return hr;
}
STDMETHOD(Save)(IStorage* pStorage, BOOL fSameAsLoad)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStorageImpl::Save\n"));
CComPtr<IPersistStreamInit> p;
p.p = IPSI_GetIPersistStreamInit();
HRESULT hr = E_FAIL;
if (p != NULL)
{
CComPtr<IStream> spStream;
static LPCOLESTR vszContents = OLESTR("Contents");
hr = pStorage->CreateStream(vszContents,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
0, 0, &spStream);
if (SUCCEEDED(hr))
hr = p->Save(spStream, fSameAsLoad);
}
return hr;
}
STDMETHOD(SaveCompleted)(IStorage* /* pStorage */)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStorageImpl::SaveCompleted\n"));
return S_OK;
}
STDMETHOD(HandsOffStorage)(void)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistStorageImpl::HandsOffStorage\n"));
return S_OK;
}
private:
IPersistStreamInit* IPSI_GetIPersistStreamInit();
};
template <class T>
IPersistStreamInit* IPersistStorageImpl<T>::IPSI_GetIPersistStreamInit()
{
T* pT = static_cast<T*>(this);
IPersistStreamInit* p;
if (FAILED(pT->GetUnknown()->QueryInterface(IID_IPersistStreamInit, (void**)&p)))
pT->_InternalQueryInterface(IID_IPersistStreamInit, (void**)&p);
return p;
}
//////////////////////////////////////////////////////////////////////////////
// IPersistPropertyBagImpl
template <class T>
class ATL_NO_VTABLE IPersistPropertyBagImpl : public IPersistPropertyBag
{
public:
// IPersist
STDMETHOD(GetClassID)(CLSID *pClassID)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistPropertyBagImpl::GetClassID\n"));
*pClassID = T::GetObjectCLSID();
return S_OK;
}
// IPersistPropertyBag
//
STDMETHOD(InitNew)()
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistPropertyBagImpl::InitNew\n"));
return S_OK;
}
STDMETHOD(Load)(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistPropertyBagImpl::Load\n"));
T* pT = static_cast<T*>(this);
ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
ATLASSERT(pMap != NULL);
return pT->IPersistPropertyBag_Load(pPropBag, pErrorLog, pMap);
}
STDMETHOD(Save)(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties)
{
ATLTRACE2(atlTraceCOM, 0, _T("IPersistPropertyBagImpl::Save\n"));
T* pT = static_cast<T*>(this);
ATL_PROPMAP_ENTRY* pMap = T::GetPropertyMap();
ATLASSERT(pMap != NULL);
return pT->IPersistPropertyBag_Save(pPropBag, fClearDirty, fSaveAllProperties, pMap);
}
HRESULT IPersistPropertyBag_Load(LPPROPERTYBAG pPropBag, LPERRORLOG pErrorLog, ATL_PROPMAP_ENTRY* pMap)
{
T* pT = static_cast<T*>(this);
HRESULT hr = AtlIPersistPropertyBag_Load(pPropBag, pErrorLog, pMap, pT, pT->GetUnknown());
if (SUCCEEDED(hr))
pT->m_bRequiresSave = FALSE;
return hr;
}
HRESULT IPersistPropertyBag_Save(LPPROPERTYBAG pPropBag, BOOL fClearDirty, BOOL fSaveAllProperties, ATL_PROPMAP_ENTRY* pMap)
{
T* pT = static_cast<T*>(this);
return AtlIPersistPropertyBag_Save(pPropBag, fClearDirty, fSaveAllProperties, pMap, pT, pT->GetUnknown());
}
};
//////////////////////////////////////////////////////////////////////////////
// CSecurityDescriptor
class CSecurityDescriptor
{
public:
CSecurityDescriptor();
~CSecurityDescriptor();
public:
HRESULT Attach(PSECURITY_DESCRIPTOR pSelfRelativeSD);
HRESULT AttachObject(HANDLE hObject);
HRESULT Initialize();
HRESULT InitializeFromProcessToken(BOOL bDefaulted = FALSE);
HRESULT InitializeFromThreadToken(BOOL bDefaulted = FALSE, BOOL bRevertToProcessToken = TRUE);
HRESULT SetOwner(PSID pOwnerSid, BOOL bDefaulted = FALSE);
HRESULT SetGroup(PSID pGroupSid, BOOL bDefaulted = FALSE);
HRESULT Allow(LPCTSTR pszPrincipal, DWORD dwAccessMask);
HRESULT Deny(LPCTSTR pszPrincipal, DWORD dwAccessMask);
HRESULT Revoke(LPCTSTR pszPrincipal);
// utility functions
// Any PSID you get from these functions should be free()ed
static HRESULT SetPrivilege(LPCTSTR Privilege, BOOL bEnable = TRUE, HANDLE hToken = NULL);
static HRESULT GetTokenSids(HANDLE hToken, PSID* ppUserSid, PSID* ppGroupSid);
static HRESULT GetProcessSids(PSID* ppUserSid, PSID* ppGroupSid = NULL);
static HRESULT GetThreadSids(PSID* ppUserSid, PSID* ppGroupSid = NULL, BOOL bOpenAsSelf = FALSE);
static HRESULT CopyACL(PACL pDest, PACL pSrc);
static HRESULT GetCurrentUserSID(PSID *ppSid);
static HRESULT GetPrincipalSID(LPCTSTR pszPrincipal, PSID *ppSid);
static HRESULT AddAccessAllowedACEToACL(PACL *Acl, LPCTSTR pszPrincipal, DWORD dwAccessMask);
static HRESULT AddAccessDeniedACEToACL(PACL *Acl, LPCTSTR pszPrincipal, DWORD dwAccessMask);
static HRESULT RemovePrincipalFromACL(PACL Acl, LPCTSTR pszPrincipal);
operator PSECURITY_DESCRIPTOR()
{
return m_pSD;
}
public:
PSECURITY_DESCRIPTOR m_pSD;
PSID m_pOwner;
PSID m_pGroup;
PACL m_pDACL;
PACL m_pSACL;
};
inline CSecurityDescriptor::CSecurityDescriptor()
{
m_pSD = NULL;
m_pOwner = NULL;
m_pGroup = NULL;
m_pDACL = NULL;
m_pSACL= NULL;
}
inline CSecurityDescriptor::~CSecurityDescriptor()
{
if (m_pSD)
delete m_pSD;
if (m_pOwner)
free(m_pOwner);
if (m_pGroup)
free(m_pGroup);
if (m_pDACL)
free(m_pDACL);
if (m_pSACL)
free(m_pSACL);
}
inline HRESULT CSecurityDescriptor::Initialize()
{
if (m_pSD)
{
delete m_pSD;
m_pSD = NULL;
}
if (m_pOwner)
{
free(m_pOwner);
m_pOwner = NULL;
}
if (m_pGroup)
{
free(m_pGroup);
m_pGroup = NULL;
}
if (m_pDACL)
{
free(m_pDACL);
m_pDACL = NULL;
}
if (m_pSACL)
{
free(m_pSACL);
m_pSACL = NULL;
}
ATLTRY(m_pSD = new SECURITY_DESCRIPTOR);
if (m_pSD == NULL)
return E_OUTOFMEMORY;
if (!InitializeSecurityDescriptor(m_pSD, SECURITY_DESCRIPTOR_REVISION))
{
HRESULT hr = HRESULT_FROM_WIN32(GetLastError());
delete m_pSD;
m_pSD = NULL;
ATLASSERT(FALSE);
return hr;
}
// Set the DACL to allow EVERYONE
SetSecurityDescriptorDacl(m_pSD, TRUE, NULL, FALSE);
return S_OK;
}
inline HRESULT CSecurityDescriptor::InitializeFromProcessToken(BOOL bDefaulted)
{
PSID pUserSid = NULL;
PSID pGroupSid = NULL;
HRESULT hr;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -