【发布时间】: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