147 lines
2.7 KiB
C++
147 lines
2.7 KiB
C++
|
#include "dataobj.h"
|
|||
|
|
|||
|
extern HINSTANCE g_hInstance;
|
|||
|
|
|||
|
DWORD g_dwID=0;
|
|||
|
DWORD g_foobar;
|
|||
|
|
|||
|
CDataObject::CDataObject(
|
|||
|
LPUNKNOWN pUnkOuter,
|
|||
|
PFNDESTROYED pfnDestroy
|
|||
|
)
|
|||
|
{
|
|||
|
m_cRef = 0;
|
|||
|
m_pUnkOuter = pUnkOuter;
|
|||
|
m_pfnDestroy = pfnDestroy;
|
|||
|
|
|||
|
m_hWndAdvise = NULL;
|
|||
|
m_dwAdvFlags = ADVF_NODATA;
|
|||
|
|
|||
|
m_pIDataObject = NULL;
|
|||
|
m_pIDataAdviseHolder = NULL;
|
|||
|
|
|||
|
m_cfeGet = CFORMATETCGET;
|
|||
|
SETDefFormatEtc(m_rgfeGet[0], CF_TEXT, TYMED_HGLOBAL);
|
|||
|
|
|||
|
m_dataText = NULL;
|
|||
|
m_cDataSize = DATASIZE_FROM_INDEX(1);
|
|||
|
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
CDataObject::~CDataObject(void)
|
|||
|
{
|
|||
|
if (NULL != m_dataText)
|
|||
|
delete m_dataText;
|
|||
|
|
|||
|
if (NULL != m_pIDataAdviseHolder)
|
|||
|
m_pIDataAdviseHolder->Release();
|
|||
|
|
|||
|
if (NULL != m_pIDataObject)
|
|||
|
delete m_pIDataObject;
|
|||
|
|
|||
|
if (NULL != m_hWndAdvise)
|
|||
|
DestroyWindow(m_hWndAdvise);
|
|||
|
}
|
|||
|
|
|||
|
BOOL
|
|||
|
CDataObject::FInit(void)
|
|||
|
{
|
|||
|
LPUNKNOWN pIUnknown = (LPUNKNOWN)this;
|
|||
|
|
|||
|
// Create the contained "IDataObject" interface and
|
|||
|
// pass it the correct containing IUnknown.
|
|||
|
if (NULL != m_pUnkOuter)
|
|||
|
pIUnknown = m_pUnkOuter;
|
|||
|
|
|||
|
m_pIDataObject = new CImpIDataObject(this, pIUnknown);
|
|||
|
|
|||
|
if (NULL == m_pIDataObject)
|
|||
|
return FALSE;
|
|||
|
|
|||
|
// [ Code for "Advise Window" goes here. ]
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
STDMETHODIMP
|
|||
|
CDataObject::QueryInterface(
|
|||
|
REFIID riid,
|
|||
|
LPLPVOID ppv
|
|||
|
)
|
|||
|
{
|
|||
|
*ppv = NULL;
|
|||
|
if (IsEqualIID(riid, IID_IUnknown))
|
|||
|
*ppv = (LPVOID)this;
|
|||
|
|
|||
|
if (IsEqualIID(riid, IID_IDataObject))
|
|||
|
*ppv = (LPVOID) m_pIDataObject;
|
|||
|
|
|||
|
if(NULL != *ppv)
|
|||
|
{
|
|||
|
((LPUNKNOWN)*ppv)->AddRef();
|
|||
|
return NOERROR;
|
|||
|
}
|
|||
|
return ResultFromScode(E_NOINTERFACE);
|
|||
|
}
|
|||
|
|
|||
|
STDMETHODIMP_(ULONG)
|
|||
|
CDataObject::AddRef(void)
|
|||
|
{
|
|||
|
return ++m_cRef;
|
|||
|
}
|
|||
|
|
|||
|
STDMETHODIMP_(ULONG)
|
|||
|
CDataObject::Release(void)
|
|||
|
{
|
|||
|
ULONG cRefT;
|
|||
|
|
|||
|
cRefT = --m_cRef;
|
|||
|
|
|||
|
if (0==m_cRef)
|
|||
|
{
|
|||
|
if (NULL != m_pfnDestroy)
|
|||
|
(*m_pfnDestroy)();
|
|||
|
delete this;
|
|||
|
}
|
|||
|
return cRefT;
|
|||
|
}
|
|||
|
|
|||
|
#ifdef NOT_SIMPLE
|
|||
|
LRESULT APIENTRY
|
|||
|
AdvisorWndProc(
|
|||
|
HWND hWnd,
|
|||
|
UINT iMsg,
|
|||
|
WPARAM wParam,
|
|||
|
LPARAM lParam
|
|||
|
)
|
|||
|
{
|
|||
|
PCDataObject pDO;
|
|||
|
|
|||
|
pDO = (PCDataObject)(GetWindowLong)(hWnd, 0);
|
|||
|
|
|||
|
switch (iMsg)
|
|||
|
{
|
|||
|
case WM_NCCREATE:
|
|||
|
pDO = (PCDataObject) ((LONG)((LPCREATESTRUCT)lParam)
|
|||
|
->lpCreateParams);
|
|||
|
SetWindowLong(hWnd, 0, (LONG)pDO);
|
|||
|
return (DefWindowProc(hWnd, iMsg, wParam, lParam));
|
|||
|
|
|||
|
#ifdef FINISHED
|
|||
|
case WM_CLOSE:
|
|||
|
// Forbid the Task Manager from closing us.
|
|||
|
return 0L;
|
|||
|
#endif /* Finished */
|
|||
|
|
|||
|
case WM_COMMAND:
|
|||
|
// [ Code for "Advise Window" goes here. ]
|
|||
|
break;
|
|||
|
|
|||
|
default:
|
|||
|
return (DefWindowProc(hWnd, iMsg, wParam, lParam));
|
|||
|
}
|
|||
|
return 0L;
|
|||
|
}
|
|||
|
#endif /* NOT_SIMPLE */
|
|||
|
|