Shell扩展:IShellExtInit :: Initialize被调用4次

时间:2014-07-22 19:24:59

标签: c++ shell com activex shell-extensions

我遇到了一个不那么独特的情况(其他人一直在问完全相同的问题)Offsite similar question ..

基本上,出于某种原因,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;
}

1 个答案:

答案 0 :(得分:2)

根据文件/类型,多次调用上下文菜单处理程序:

  • 用于文件/文件夹本身
  • 表示文件的父文件夹
  • 用于文件夹背景
  • 如果* .lnk文件也针对目标,则指向

如果资源管理器显示树视图,那么该部分也会调用您的处理程序。