However, I cannot see any obvious errors in my code - perhaps somebody can
help me here :) Here is a few snippets of code from the application:
void __fastcall TForm1::initializeDragDrop(TObject *Sender)
{
OleInitialize( NULL );
iDropTarg *iDrop=new iDropTarg();
iDrop->Memo=Memo1;
int res = RegisterDragDrop( Memo1->Handle, iDrop );
if (res!=S_OK) ShowMessage("RegisterDragDrop Failed: "+IntToStr(res));
}
class iDropTarg : public IDropTarget
{
private:
ULONG ref_count;
public:
HRESULT __stdcall QueryInterface(REFIID riid, void **ppv);
ULONG __stdcall AddRef() { InterlockedIncrement((long *)&ref_count);
return ref_count; }
ULONG __stdcall Release() { if (InterlockedDecrement((long *)&ref_count)
<= 0)
delete this;
return ref_count; }
HRESULT __stdcall DragEnter(IDataObject *pDataObject,
DWORD grfKeyState, _POINTL pt, DWORD *pdwEffect);
HRESULT __stdcall DragOver(DWORD grfKeyState, _POINTL pt,
DWORD *pdwEffect);
HRESULT __stdcall DragLeave();
HRESULT __stdcall Drop(IDataObject *pDataObject, DWORD grfKeyState,
_POINTL pt, DWORD *pdwEffect);
TMemo *Memo;
};
HRESULT __stdcall iDropTarg::QueryInterface(REFIID riid, void **ppv)
{
if (IsEqualIID(riid,IID_IUnknown))
{
*ppv = static_cast<IUnknown *>(this);
return S_OK;
}
else if (IsEqualIID(riid,IID_IDropTarget))
{
*ppv = static_cast<IDropTarget *>(this);
return S_OK;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}
HRESULT __stdcall iDropTarg::DragEnter(IDataObject *pDataObject,
DWORD grfKeyState, _POINTL pt, DWORD *pdwEffect)
{
if (!pDataObject) Memo->Lines->Add("BIG ERROR");
FORMATETC fe={0};
fe.cfFormat=CF_TEXT;
fe.dwAspect=DVASPECT_CONTENT;
fe.ptd=NULL;
fe.tymed=TYMED_HGLOBAL;
fe.lindex=(long)-1;
HRESULT hres = pDataObject->QueryGetData(&fe); //do we like what this
dataobject has?
if (SUCCEEDED(hres))
{
//Will be used eventually...
};
//At this point hres==S_FALSE :(
Memo->Lines->Add((AnsiString)"RESULT OF DROP-ENTER QUERY: "+hres);
return S_OK; //should be hres, when it is correct
}
HRESULT __stdcall iDropTarg::DragOver(DWORD grfKeyState, _POINTL pt,
DWORD *pdwEffect)
{
Memo->Lines->Add((AnsiString)"OVER");
return S_OK;
}
HRESULT __stdcall iDropTarg::DragLeave()
{
Memo->Lines->Add((AnsiString)"LEFT");
return S_OK;
}
HRESULT __stdcall iDropTarg::Drop(IDataObject *pDataObject, DWORD
grfKeyState,
_POINTL pt, DWORD *pdwEffect)
{
FORMATETC fe={0};
STGMEDIUM stg={0};
HRESULT hres=0;
String dropstr="INCORRECT";
fe.cfFormat=CF_TEXT;
fe.dwAspect=DVASPECT_CONTENT;
fe.ptd=0;
fe.tymed=TYMED_HGLOBAL;
fe.lindex=(long)-1;
Memo->Lines->Add((AnsiString)"DROP AT X: "+(int)pt.x+" Y: "+(int)pt.y);
// X and Y values are correct
hres = pDataObject->QueryGetData(&fe); //do we like what this dataobject
has?
Memo->Lines->Add((AnsiString)"RESULT OF DROP QUERY: "+hres);
hres = pDataObject->GetData(&fe,&stg);
Memo->Lines->Add((AnsiString)"RESULT OF DROP GET: "+hres);
// Here stg contains NULL data!!! :(
// if (SUCCEEDED(hres))
// {
dropstr = String((char
*)GlobalLock(stg.hGlobal),GlobalSize(stg.hGlobal));
Memo->Lines->Add((AnsiString)"DROPPED: '"+dropstr+"' : SIZE:
"+IntToStr(GlobalSize(stg.hGlobal)));
GlobalUnlock(stg.hGlobal);
ReleaseStgMedium(&stg);
// };
return S_OK;
}
All works ok now :)
"Wayne Phillips" <wphi...@ntlworld.com> wrote in message
news:p_eV8.5087$xf3.9...@news11-gui.server.ntli.net...