Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Drag-and-Drop problems =(

4 views
Skip to first unread message

Wayne Phillips

unread,
Jul 5, 2002, 7:00:48 AM7/5/02
to
Hi all, I'm having a few problems setting up my application to accept
drag-drop from other programs through OLE. Currently, it all works - i.e.
my application receives the DragEnter/DragDrop/DragLeave and DragMove
events, however any calls to QueryGetData() or GetData() fail.
QueryGetData() fails with S_FALSE which indicates that the operation was a
success, but the output was not as expected. QueryGetData() fails with
0x8007057 which indicates that an input parameter is incorrect.

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;
}


Wayne Phillips

unread,
Jul 5, 2002, 8:09:05 AM7/5/02
to
Its ok, i've worked it out now, CF_TEXT was the wrong type, its actually
CF_HDROP.

All works ok now :)

"Wayne Phillips" <wphi...@ntlworld.com> wrote in message
news:p_eV8.5087$xf3.9...@news11-gui.server.ntli.net...

0 new messages