На главную

On-line справка по Win32 API

Написать письмо
БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО!
Список всех статей A-B-C-D-E-F-G-H-I-J-K-L-M-N-O-P-Q-R-S-T-U-V-W-X-Y-Z | Скачать Вниз

How the Shell Accesses Shell Extension Handlers



The shell uses two interfaces to initialize instances (objects created by IClassFactory::CreateInstance) of shell extensions: IShellExtInit and IPersistFile. The shell uses the IShellExtInit interface to initialize instances of context menu handlers, drag and drop handlers, and property sheet handlers. The shell uses IPersistFile to initialize instances of icon handlers, data handlers, and drop handlers. This interface is defined by OLE.

The IShellExtInit interface adds an additional member function, Initialize, to the standard IUnknown interface. A handler's Initialize function should keep a copy of the parameters that the shell passes to the function for later use. An example showing how to initialize instances follows.

STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
LPDATAOBJECT pDataObj, HKEY hRegKey)
{
// Initialize can be called more than once.
if (m_pDataObj)
m_pDataObj->Release();

// Save the object pointer.
if (pDataObj) {
m_pDataObj = pDataObj;
pDataObj->AddRef();
}

// Duplicate the registry handle.
if (hRegKey)
RegOpenKeyEx(hRegKey, NULL, 0L, MAXIMUM_ALLOWED,
&this->hRegKey);


return NOERROR;
}


A shell extension handler must implement three functions: an entrypoint function (often called DllMain or LibMain), DllCanUnloadNow, and DllGetClassObject.
DllCanUnloadNow and DllGetClassObject are essentially the same as they would be for any OLE in-process server DLL. The use of DllCanUnloadNow is shown in the following example.

STDAPI DllCanUnloadNow(void)
{
// g_cRefThisDll must be placed in the instance-specifc
// data section.
return ResultFromScode((g_cRefThisDll==0) ? S_OK : S_FALSE);
}


DllGetClassObject needs to expose the class factory for the object in the DLL. For more information about exposing the class factory, see the OLE documentation included in the Microsoft® Win32® Software Development Kit (SDK). The following example shows how to expose the class factory.

// DllGetClassObject - a DLL entrypoint function used by
// most in-process server DLLs.

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
{
*ppvOut = NULL; // assume failure

if (IsEqualIID(rclsid, CLSID_ShellExtension)) {
return CShellExtSample_Create(riid, ppvOut);
} else {
return CLASS_E_CLASSNOTAVAILABLE;
}
}



Пригласи друзей и счет твоего мобильника всегда будет положительным!
Предыдущая статья
 
Сайт Народ.Ру Интернет
Следующая статья
Пригласи друзей и счет твоего мобильника всегда будет положительным!

Как Оболочка Имеет доступ ко Вручителям Расширения Shell



Оболочка использует два интерфейса, чтобы инициализировать примеры (объекты создавались IClassFactory::CreateInstance) расширений оболочки: IShellExtInit и IPersistFile. Оболочка использует интерфейс IShellExtInit, чтобы инициализировать примеры контекстных вручителей меню, перераспределять вручителей, и листовых вручителей свойства. Оболочка использует IPersistFile, чтобы инициализировать примеры иконных вручителей, вручителей данных и бросать вручителей. Этот интерфейс определен OLE.

Интерфейс IShellExtInit добавляет дополнительную функцию элемента, Инициализирует, на стандартный интерфейс IUnknown. Вручитель Initialize функция должна держать копию параметров, которые оболочка передает в функцию для последующего использования. Пример, показывающий как, чтобы инициализировать примеры следует.

STDMETHODIMP CShellExt::ИНИЦИАЛИЗИРУЙТЕ(LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hRegKey)
{
// Инициализируйте, может называться неоднократно.
если (m_pDataObj) m_pDataObj->Release();

// Сохраняемый объектный указатель.
если (pDataObj) { m_pDataObj = pDataObj;
pDataObj->AddRef();
}

// Дубликат ручка регистрации.
если (hRegKey)
RegOpenKeyEx(hRegKey, НЕДЕЙСТВИТЕЛЬНЫЙ, 0L, MAXIMUM_ALLOWED, &this->hRegKey);


возвращайте NOERROR;
}


Вручитель расширения оболочки должен осуществить три функции: функция entrypoint (часто назвавшее DllMain или LibMain), DllCanUnloadNow, и DllGetClassObject.
DllCanUnloadNow И DllGetClassObject по существу такие же как и они быть для любого сервера изготовления OLE DLL. Использование DllCanUnloadNow показано в следующем примере.

STDAPI DllCanUnloadNow(ПУСТОТА)
{
// g_cRefThisDll должен быть установлен в примере-specifc // секция данных.
возвращайте ResultFromScode((g_cRefThisDll==0)? S_OK : S_FALSE);
}


DllGetClassObject НУЖНО подвергать завод класса для объекта в DLL. Более подробно о подвергающем заводе класса, смотри документацию OLE включенную в Microsoft Win32 Программный Комплект Разработки (SDK). Следующий пример показывает как, чтобы подвергать завод класса.

// DllGetClassObject - DLL entrypoint ФУНКЦИЯ использовалась // наиболее сервером изготовления DLLs.

STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
{
*ppvOut = НЕДЕЙСТВИТЕЛЬНЫЙ; // примите неудачу

если (IsEqualIID(rclsid, CLSID_ShellExtension)) { возврат CShellExtSample_Create(riid, ppvOut);
} еще {
возвращайте CLASS_E_CLASSNOTAVAILABLE;
}
}



Вверх Version 1.3, Oct 26 2010 © 2007, 2010, mrhx Вверх
 mrhx software  Русский перевод OpenGL  Русский перевод Win32 API
 
Используются технологии uCoz