Пожалуйста подскажите: Я тут пытаюсь слобать прогу которая будет принимать файлы. Но есть маленькая проблема: сообщения из Microsoft Outlook напрямую не перетаскиваются. Из Outlook на рабочий стол а потом на мою форму — работает, а вот напрямую нет. Помогите решить эту проблему.
Здравствуйте, Sein, Вы писали:
S>Пожалуйста подскажите: Я тут пытаюсь слобать прогу которая будет принимать файлы. Но есть маленькая проблема: сообщения из Microsoft Outlook напрямую не перетаскиваются. Из Outlook на рабочий стол а потом на мою форму — работает, а вот напрямую нет. Помогите решить эту проблему.
Самый правильный подход зарегистрировать твою форму как окно принимающее операции DragandDrop
делает это Api функция RegisterDragDrop(HWND hwnd,IDropTarget * pDropTarget)
И ещё тебе придется создать класс реализующий интерфейс IDropTarget что то на подобии такого:
class DradAndDrop:public TInterfacedObject, IDropTarget{
...
};
За оттальными вопросами к MSDN
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Sein, Вы писали:
S>>Пожалуйста подскажите: Я тут пытаюсь слобать прогу которая будет принимать файлы. Но есть маленькая проблема: сообщения из Microsoft Outlook напрямую не перетаскиваются. Из Outlook на рабочий стол а потом на мою форму — работает, а вот напрямую нет. Помогите решить эту проблему.
А>Самый правильный подход зарегистрировать твою форму как окно принимающее операции DragandDrop
А>делает это Api функция RegisterDragDrop(HWND hwnd,IDropTarget * pDropTarget)
А>И ещё тебе придется создать класс реализующий интерфейс IDropTarget что то на подобии такого:
А>class DradAndDrop:public TInterfacedObject, IDropTarget{
А>...
А>};
А>За оттальными вопросами к MSDN
Спасибо за совет!
Но есть ещё проблема при определении класса DradAndDrop компилятор ругается на определение функций которые я перекрываю в своём классе. А пишу я вот так:
class TMyDropTarget : public TInterfacedObject, IDropTarget
{
protected:
virtual HRESULT DragEnter(IDataObject *pDataObject,DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
virtual HRESULT DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
virtual HRESULT DragLeave(void);
virtual HRESULT Drop(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
};
Может я что-то не так делаю подскажите, я не очень то силён пока в С++.
Нельзя ли узнать что именно выдаёт компилятор!
Ну за неимением такового попробую предположить.
Да вроде отсутствует словечко одно в декларации __stdcall
А вообще лучше всего использовать специяльно предназначеный макрос STDMETHODIMP
Честно говоря сделано то всё вроде правильно!
Да к стати компилятор будет ещё ругаться на отсутствие методов IUnknown
Проблему я просто решил лишним вызовом:
virtual HRESULT __stdcall QueryInterface(const GUID& IID, void **Obj){
return TInterfacedObject::QueryInterface(IID, (void *)Obj);
};
И на последок вот пример который перетаскивает имена файлов в editbox:
//---------------------------------------------------------------------------
HRESULT _stdcall TDropTarget::DragEnter(IDataObject * pDataObject,DWORD grfKeyState,POINTL pt,DWORD * pdwEffect){
return S_OK;
};
HRESULT _stdcall TDropTarget::DragOver(DWORD grfKeyState,POINTL pt,DWORD * pdwEffect){
return S_OK;
};
HRESULT _stdcall TDropTarget::DragLeave(void){
return S_OK;
};
HRESULT _stdcall TDropTarget::Drop(IDataObject * pDataObject,DWORD grfKeyState,POINTL pt,DWORD * pdwEffect){
STGMEDIUM Data;
FORMATETC Format={CF_HDROP,NULL,DVASPECT_CONTENT,-1,1};
HRESULT returnval=pDataObject->GetData(&Format,&Data);
if((returnval==S_OK)&&(Data.tymed==TYMED_HGLOBAL)){
UINT buffSize=DragQueryFile(Data.hGlobal,0,NULL,0);
char* Buffer=new char[buffSize+1];
DragQueryFile(Data.hGlobal,0,Buffer,buffSize+1);
Form1->FileName->Text=Buffer;
delete[] Buffer;
GlobalFree(Data.hGlobal);
};
return returnval;
};
Спасибо огромное!

Просто супер!
В самом деле не хватало __stdcall. Всё работает просто класно.
Но вот ещё вопрос я бы очень хотел научиться разбирать IDataObject который передаётся при Drop. Я как бы хотел видеть не только файлы, но например письмо которое переташили из Outlook. Где об этом можно прочитать или что нибудь вы скажете дельное?
Заранее спасибо!
Здравствуйте, Аноним, Вы писали:
А>Чатай MSDN:
А>если нет локальной версии то ту на форуме есть ссылка на него
ОК!
Спасибо, попробую разобраться.