/**************************************************************************
File: DataObj.cpp
Description:
**************************************************************************/
/**************************************************************************
#include statements
**************************************************************************/
#include "stdafx.h"
#include <shlobj.h>
#include "DataObj.h"
using namespace System::Runtime::InteropServices;
namespace ShellUtils
{
/**************************************************************************
CDataObject::CDataObject()
**************************************************************************/
CDataObject::CDataObject()
{
}
/**************************************************************************
CDataObject::~CDataObject()
**************************************************************************/
CDataObject::~CDataObject()
{
Clear();
}
void CDataObject::Clear()
{
for(Storage::iterator it = m_storage.begin(); it != m_storage.end(); ++it)
ReleaseStgMedium(it->lpMed);
}
///////////////////////////////////////////////////////////////////////////
//
// IUnknown Implementation
//
/**************************************************************************
CDataObject::QueryInterface()
**************************************************************************/
STDMETHODIMP CDataObject::QueryInterface(REFIID riid, LPVOID *ppvOut)
{
*ppvOut = NULL;
//IUnknown
if(IsEqualIID(riid, IID_IUnknown))
{
*ppvOut = this;
return S_OK;
}
//IDataObject
if(IsEqualIID(riid, IID_IDataObject))
{
*ppvOut = (IDataObject*)this;
return S_OK;
}
return E_NOINTERFACE;
}
/**************************************************************************
CDataObject::AddRef()
**************************************************************************/
STDMETHODIMP_(ULONG) CDataObject::AddRef(void)
{
return 2;
}
/**************************************************************************
CDataObject::Release()
**************************************************************************/
STDMETHODIMP_(ULONG) CDataObject::Release(void)
{
return 1;
}
///////////////////////////////////////////////////////////////////////////
//
// IDataObject Implementation
//
/**************************************************************************
CDataObject::GetData()
**************************************************************************/
STDMETHODIMP CDataObject::GetData(LPFORMATETC pFE, LPSTGMEDIUM pSM)
{
if (pFE == NULL || pSM == NULL)
return E_INVALIDARG;
pSM->hGlobal = NULL;
for(Storage::iterator it = m_storage.begin(); it != m_storage.end(); ++it)
{
if (pFE->tymed & it->lpFmt->tymed &&
pFE->dwAspect == it->lpFmt->dwAspect &&
pFE->cfFormat == it->lpFmt->cfFormat)
{
CopyStgMedium(it->lpMed, pSM);
return S_OK;
}
}
return DV_E_FORMATETC;
}
/**************************************************************************
CDataObject::GetDataHere()
**************************************************************************/
STDMETHODIMP CDataObject::GetDataHere(LPFORMATETC pFE, LPSTGMEDIUM pSM)
{
return E_NOTIMPL;
}
/**************************************************************************
CDataObject::QueryGetData()
**************************************************************************/
STDMETHODIMP CDataObject::QueryGetData(LPFORMATETC pFE)
{
if (pFE == NULL)
return E_INVALIDARG;
//support others if needed DVASPECT_THUMBNAIL //DVASPECT_ICON //DVASPECT_DOCPRINT
if (!(DVASPECT_CONTENT & pFE->dwAspect))
return (DV_E_DVASPECT);
HRESULT hr = DV_E_TYMED;
for(Storage::iterator it = m_storage.begin(); it != m_storage.end(); ++it)
{
if (pFE->tymed & it->lpFmt->tymed)
{
if (pFE->cfFormat == it->lpFmt->cfFormat)
return S_OK;
else
hr = DV_E_CLIPFORMAT;
}
else
hr = DV_E_TYMED;
}
return hr;
}
/**************************************************************************
CDataObject::GetCanonicalFormatEtc()
**************************************************************************/
STDMETHODIMP CDataObject::GetCanonicalFormatEtc(LPFORMATETC pFE1, LPFORMATETC pFE2)
{
return DATA_S_SAMEFORMATETC;
}
/**************************************************************************
CDataObject::SetData()
**************************************************************************/
STDMETHODIMP CDataObject::SetData(LPFORMATETC pFE , LPSTGMEDIUM pSM, BOOL fRelease)
{
if (pFE == NULL || pSM == NULL)
return E_INVALIDARG;
for(Storage::iterator it = m_storage.begin(); it != m_storage.end(); ++it)
{
if (pFE->tymed & it->lpFmt->tymed &&
pFE->dwAspect == it->lpFmt->dwAspect &&
pFE->cfFormat == it->lpFmt->cfFormat)
{
m_storage.erase(it);
break;
}
}
FORMATETC* fetc=new FORMATETC;
STGMEDIUM* pStgMed = new STGMEDIUM;
if (fetc == NULL || pStgMed == NULL)
return E_OUTOFMEMORY;
ZeroMemory(fetc, sizeof(FORMATETC));
ZeroMemory(pStgMed, sizeof(STGMEDIUM));
*fetc = *pFE;
if (fRelease)
*pStgMed = *pSM;
else
CopyStgMedium(pSM, pStgMed);
DataStorage storage;
storage.lpFmt = fetc;
storage.lpMed = pStgMed;
m_storage.push_back(storage);
return S_OK;
}
/**************************************************************************
CDataObject::EnumFormatEtc()
**************************************************************************/
STDMETHODIMP CDataObject::EnumFormatEtc(DWORD dwDir, LPENUMFORMATETC *ppEnum)
{
*ppEnum = NULL;
switch(dwDir)
{
case DATADIR_GET:
{
*ppEnum = new CEnumFormatEtc(m_storage);
if(*ppEnum)
return S_OK;
break;
}
default:
return OLE_S_USEREG;
}
return E_OUTOFMEMORY;
}
/**************************************************************************
CDataObject::DAdvise()
**************************************************************************/
STDMETHODIMP CDataObject::DAdvise( LPFORMATETC pFE,
DWORD advf,
LPADVISESINK pAdvSink,
LPDWORD pdwConnection)
{
return E_NOTIMPL;
}
/**************************************************************************
CDataObject::DUnadvise()
**************************************************************************/
STDMETHODIMP CDataObject::DUnadvise(DWORD dwConnection)
{
return E_NOTIMPL;
}
/**************************************************************************
CDataObject::EnumDAdvise()
**************************************************************************/
STDMETHODIMP CDataObject::EnumDAdvise(LPENUMSTATDATA *ppenumAdvise)
{
return OLE_E_ADVISENOTSUPPORTED;
}
DataObjectEx::DataObjectEx()
{
_pDataObject = new CDataObject();
}
DataObjectEx::~DataObjectEx()
{
if(_pDataObject)
{
_pDataObject->Release();
_pDataObject = NULL;
}
}
void DataObjectEx::SetData(Object* o)
{
DataObject::SetData(o);
CacheData(o->GetType()->ToString());
}
void DataObjectEx::SetData(String* s, Object* o)
{
DataObject::SetData(s, o);
CacheData(s);
}
void DataObjectEx::SetData(Type* t, Object* o)
{
DataObject::SetData(t, o);
CacheData(t->ToString());
}
void DataObjectEx::SetData(String* s, bool b, Object* o)
{
DataObject::SetData(s, b, o);
CacheData(s);
}
void _CacheData(LPFORMATETC lpFetc, LPDATAOBJECT pSrc, LPDATAOBJECT pDest)
{
STGMEDIUM stgMed;
if(SUCCEEDED(pSrc->QueryGetData(lpFetc)))
{
pSrc->GetData(lpFetc, &stgMed);
C#实现Drag and Drop操作例子
5星 · 超过95%的资源 需积分: 10 133 浏览量
2010-08-13
15:45:36
上传
评论 3
收藏 35KB RAR 举报
cc_net
- 粉丝: 886
- 资源: 6
最新资源
- Screenshot_20240427_031602.jpg
- 网页PDF_2024年04月26日 23-46-14_QQ浏览器网页保存_QQ浏览器转格式(6).docx
- 直接插入排序,冒泡排序,直接选择排序.zip
- 在排序2的基础上,再次对快排进行优化,其次增加快排非递归,归并排序,归并排序非递归版.zip
- 实现了7种排序算法.三种复杂度排序.三种nlogn复杂度排序(堆排序,归并排序,快速排序)一种线性复杂度的排序.zip
- 冒泡排序 直接选择排序 直接插入排序 随机快速排序 归并排序 堆排序.zip
- 课设-内部排序算法比较 包括冒泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序和堆排序.zip
- Python排序算法.zip
- C语言实现直接插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序、计数排序,并带图详解.zip
- 常用工具集参考用于图像等数据处理
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
- 5
- 6
前往页