Расширение оболочки: IShellExtInit :: Initialize вызывается 4 раза

Я столкнулся с ситуацией, которая не настолько уникальна (другие задают точно такой же вопрос) Вне аналогичного вопроса..

По какой-то причине код в реализации IShellExtInit :: Initialize, который должен вызываться один раз после каждого щелчка правой кнопкой мыши по файлу, в конечном итоге вызывается 4 раза.

STDMETHODIMP My_ShellExtInit::Initialize (LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID ) {
FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT,
-1, TYMED_HGLOBAL };
STGMEDIUM stg = { TYMED_HGLOBAL };
HDROP     hDrop;

if ( FAILED( pDataObj->GetData ( &fmt, &stg ) ))
return E_INVALIDARG;

hDrop = (HDROP) GlobalLock ( stg.hGlobal );

if ( NULL == hDrop )
return E_INVALIDARG;

UINT uNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 );
HRESULT hr = S_OK;

if ( 0 == uNumFiles )    {
GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );
return E_INVALIDARG;
}

if ( 0 == DragQueryFile ( hDrop, 0, m_szFile, MAX_PATH ) )
hr = E_INVALIDARG;

system("echo INVOKED >> log.txt");
// QMessageBox::warning(NULL, "Foo!", TCHARToQString(m_szFile));

GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );

return hr;
}

0

Решение

В зависимости от файла / типа ваш обработчик контекстного меню вызывается несколько раз:

  • для самого файла / папки
  • для родительской папки файла
  • для фона папки
  • в случае файла * .lnk также для цели он указывает на

И если проводник показывает представление дерева, то эта часть также вызывает ваш обработчик.

2

Другие решения


По вопросам рекламы [email protected]