【问题标题】:Shell Extension: IShellExtInit::Initialize called 4 timesShell 扩展:IShellExtInit::Initialize 调用了 4 次
【发布时间】:2018-11-08 19:37:41
【问题描述】:

我遇到的情况并不那么独特(其他人一直在问完全相同的问题)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;
}

【问题讨论】:

  • 如果与 Initialize 调用关联的 COM 对象已被释放,则没有问题。
  • 你的 shell 扩展的单个实例的初始化被调用了 4 次?还是 shell 在每次调用之前创建新实例?

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


【解决方案1】:

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

  • 文件/文件夹本身
  • 文件的父文件夹
  • 文件夹背景
  • 如果 *.lnk 文件也用于它指向的目标

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

【讨论】:

  • 那……太棒了 :) 你知道有一个好地方可以让我了解为什么/还有什么潜伏在那里吗?
  • 大部分都以某种方式记录在案。例如,您必须记住,上下文菜单处理程序不仅被调用以显示上下文菜单,而且还用于找出可用的动词、执行动词或获取命令描述,...
  • 嗨@Stefan 我遇到了类似的问题。对于 .lnk 文件,Initialize 会被调用两次。我怎样才能限制它,以便它只为 .lnk 文件调用一次?
猜你喜欢
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多