Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП - методички / OS&SP_Lab_2.6(shell).doc
Скачиваний:
95
Добавлен:
18.05.2015
Размер:
1.12 Mб
Скачать

Использование AppWizard

Запустите AppWizard и создайте новый ATL COM проект. Назовем его SendToClone. Пометьте переключатель Support MFC и щелкните Finish. Чтобы добавить COM объект к DLL, перейдите в дерево просмотра классов, ClassView, щелкните правой кнопкой на пункте SendToClone classes и укажите New ATL Object.

В мастере ATL объектов, на первой панели уже указан Simple Object, поэтому просто щелкните Next. Во второй панели, в поле редактирования Short Name введите краткое имя SendToShlExt и щелкните OK. (Остальные поля заполняются автоматически.) Мы создали класс CSendToShlExt, который содержит основной код для реализации объекта COM. Добавим свой код к этому классу.

Интерфейс инициализации

Т.к. обработчик сбрасывания загружается на цели сбрасывания (файле, на который осуществляется сбрасывание), инициализация осуществляется посредством интерфейса IPersistFile. Вспомните, что этот интерфейс используется для расширений, оперирующих только одиночными файлами. IPersistFile имеет много методов, но расширению необходимо реализовать только один метод - Load().

Нам необходимо добавить IPersistFile в список интерфейсов, которые реализует CSendToShlExt. Откройте SendToShlExt.h и добавьте выделенные строки:

#include <comdef.h>

#include <shlobj.h>

class ATL_NO_VTABLE CSendToShlExt :

public CComObjectRootEx<CComSingleThreadModel>,

public CComCoClass<CSendToShlExt, &CLSID_SendToShlExt>,

public IDispatchImpl<ISendToShlExt, &IID_ISendToShlExt, &LIBID_SENDTOCLONELib>,

public IPersistFile

{

BEGIN_COM_MAP(CSendToShlExt)

COM_INTERFACE_ENTRY(ISendToShlExt)

COM_INTERFACE_ENTRY(IDispatch)

COM_INTERFACE_ENTRY(IPersistFile)

END_COM_MAP()

public:

// IPersistFile

STDMETHOD(GetClassID)(LPCLSID) { return E_NOTIMPL; }

STDMETHOD(IsDirty)() { return E_NOTIMPL; }

STDMETHOD(Load)(LPCOLESTR, DWORD) { return S_OK; }

STDMETHOD(Save)(LPCOLESTR, BOOL) { return E_NOTIMPL; }

STDMETHOD(SaveCompleted)(LPCOLESTR) { return E_NOTIMPL; }

STDMETHOD(GetCurFile)(LPOLESTR*) { return E_NOTIMPL; }

Заметьте, что Load() не делает ничего, кроме возврата S_OK. Load() получает имя файла, который является целью для сбрасывания, но для нашего расширения нет необходимости заботиться об этом имени, поэтому мы его игнорируем.

Участвуем в операции drag and drop

Чтобы выполнить свою работу, наше расширение должно связываться с источником сбрасывания, которым является проводник. Наше расширение получает список перетаскиваемых файлов, и проводник сообщает его, независимо от того, будут ли приняты эти файлы, если пользователь надумает их сбросить. Эта связь осуществляется, естественно, через интерфейс: IDropTarget. Методы IDropTarget:

  • DragEnter(): Метод вызывается, когда пользователь заносит файл над целью. Этот метод сообщает проводнику, примет ли расширение файлы, если они будут сброшены.

  • DragOver(): Не вызывается для расширений оболочки.

  • DragLeave(): Вызывается, когда файл утаскивают от цели без сбрасывания.

  • Drop(): Вызывается, когда пользователь сбрасывает на целевой файл. Вот где расширение выполняет свою работу.

Чтобы добавить IDropTarget к CSendToShlExt, откройте SendToShlExt.h и добавьте выделенные строки:

class ATL_NO_VTABLE CSendToShlExt :

public CComObjectRootEx<CComSingleThreadModel>,

public CComCoClass<CSendToShlExt, &CLSID_SendToShlExt>,

public IDispatchImpl<ISendToShlExt, &IID_ISendToShlExt, &LIBID_SENDTOCLONELib>,

public IPersistFile,

public IDropTarget

{

BEGIN_COM_MAP(CSendToShlExt)

COM_INTERFACE_ENTRY(ISendToShlExt)

COM_INTERFACE_ENTRY(IDispatch)

COM_INTERFACE_ENTRY(IPersistFile)

COM_INTERFACE_ENTRY(IDropTarget)

END_COM_MAP()

protected:

// ISendToShlExt

CStringList m_lsDroppedFiles;

public:

// IDropTarget

STDMETHOD(DragEnter)(IDataObject* pDataObj, DWORD grfKeyState,

POINTL pt, DWORD* pdwEffect);

STDMETHOD(DragOver)(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)

{ return E_NOTIMPL; }

STDMETHOD(DragLeave)();

STDMETHOD(Drop)(IDataObject* pDataObj, DWORD grfKeyState,

POINTL pt, DWORD* pdwEffect);

}

Как и в предыдущих расширениях, нам понадобится строковый список, чтобы хранить имена перетаскиваемых файлов. Метод DragOver() не нуждается в реализации, т.к. он не вызывается. Далее я приведу оставшиеся три метода.

Соседние файлы в папке ОСиСП - методички