![](/img/trans.png)
[英]Shell Extension: IShellExtInit::Initialize called 4 times
[英]Icon Handler Shell Extension not called
我使用VS2015和ATL项目向导编写了Shell Extension Icon处理程序 。 我创建了一个COM对象来公开IPersist和IExtractIcon接口。 当我查看特定文件类型的注册表项时,可以看到该处理程序已注册。 这是该类的样子:
class ATL_NO_VTABLE CIconHandlerExt :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CIconHandlerExt, &CLSID_IconHandlerExt>,
public IIconHandlerExt,
public IPersistFile,
public IExtractIcon
{
public:
CIconHandlerExt()
{
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
DECLARE_REGISTRY_RESOURCEID(IDR_ICONHANDLEREXT)
DECLARE_NOT_AGGREGATABLE(CIconHandlerExt)
BEGIN_COM_MAP(CIconHandlerExt)
COM_INTERFACE_ENTRY(IIconHandlerExt)
COM_INTERFACE_ENTRY(IPersistFile)
COM_INTERFACE_ENTRY(IExtractIcon)
END_COM_MAP()
// IIconHandlerExt
public:
// IExtractIcon
STDMETHODIMP GetIconLocation(UINT uFlags, LPTSTR szIconFile, UINT cchMax, int* piIndex, UINT* pwFlags);
STDMETHODIMP Extract(LPCTSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize);
public:
// IPersistFile
//xxxSTDMETHOD(GetClassID)(CLSID*) { return E_NOTIMPL; }
STDMETHOD(GetClassID)(CLSID *pClsId) { *pClsId = CLSID_IconHandlerExt; return S_OK; }
STDMETHOD(IsDirty)() { return E_NOTIMPL; }
STDMETHOD(Save)(LPCOLESTR, BOOL) { return E_NOTIMPL; }
STDMETHOD(SaveCompleted)(LPCOLESTR) { return E_NOTIMPL; }
STDMETHOD(GetCurFile)(LPOLESTR*) { return E_NOTIMPL; }
STDMETHOD(Load)(LPCOLESTR wszFile, DWORD /*dwMode*/)
{
USES_CONVERSION;
lstrcpyn(m_szFilename, OLE2CT(wszFile), MAX_PATH);
return S_OK;
}
protected:
TCHAR m_szFilename[MAX_PATH]; // Full path to the file in question.
};
OBJECT_ENTRY_AUTO(__uuidof(IconHandlerExt), CIconHandlerExt)
我使用了这篇文章中的说明来启动调试会话。 即,我单击任务栏,单击Alt-F4,按Ctrl-Alt-Shift-Escape,然后启动将Windows资源管理器指定为命令目标的调试器会话。 我设置断点并导航到测试文件。
我的处理程序永远不会加载,因为没有命中断点,他们说
“断点目前不会被击中。 该文档尚未加载任何符号。”
任何人都可以阐明为什么我的扩展程序无法加载吗?
这个问题已经解决。
Shell扩展程序需要更新向导生成的注册表脚本,以标识应用于特定文件类型的处理程序。 我没有注意我正在更新的密钥(从注册表脚本中)并更新了错误的密钥。 就我而言,我试图为其添加处理程序的文件类型为“ mcam”。 因此,我更新了“ HKCR.mcam”键。 这是不正确的,因为此初始键的目的是(通过“ mcamFile”子键)指向确定要加载哪个处理程序的实际注册表键。 更改脚本以更新“ HKCR \\ mcamFile”密钥后,处理程序已加载,并且能够调试代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.