c++ - 我可以用文件初始化 IThumbnailProvider 对象吗?
问题描述
我正在编写一个实现的缩略图提供程序IInitializeWithFile
,但是传递给初始化方法的文件路径无效。
- 我在
"DisableProcessIsolation"
注册表中创建了值HKCR\CLSID\{CLSID of my thumbnail provider}
以选择退出进程隔离以便能够使用IInitializeWithFile
/IInitializeWithItem
而不是IInitializeWithStream
. - 我用 测试了我的代码
IInitializeWithStream
,效果很好。IStream
从文件路径中检索对象SHCreateStreamOnFile()
失败。 - 传递的文件路径无效(
PathFileExistsW(FilePath)
返回 false)。 - 缩略图提供程序已正确注册(注册表项均已正确设置,并且在使用时工作正常
IInitializeWithStream
)。
我不能使用的原因IInitializeWithStream
是我需要文件的路径才能返回正确的缩略图。
IFACEMETHODIMP RecipeThumbnailProvider::Initialize(LPCWSTR FilePath, DWORD Mode){
std::wofstream *FileStream1 = new std::wofstream("D:\\test1.txt");
if(!PathFileExistsW(FilePath)){//check if the passed path is valid
(*FileStream1)<< L"path invalid";
}else{
(*FileStream1)<<L"path valid" << FilePath;
}
(*FileStream1).close();
// A handler instance should be initialized only once in its lifetime.
HRESULT hr = ERROR_ALREADY_INITIALIZED;
if (m_pStream == NULL)
{
hr = SHCreateStreamOnFileW(FilePath, Mode, &m_pStream);//get IStream from file path
}
return hr;
}
解决方案
看来您只能IInitializeWithStream
从 Windows Vista 开始使用。
我在这里做了一些广泛的测试(参见这个拉取请求和这个拉取请求。测试表明该Initialize
方法不会被调用,除非服务器实现IInitializeWithStream
。
最新的 MSDN 文档位于:
https://docs.microsoft.com/en-us/windows/win32/api/thumbcache/nn-thumbcache-ithumbnailprovider
似乎也暗示了这一点:
Shell 使用项目的流调用 IInitializeWithStream::Initialize,并且 IInitializeWithStream 是在进程外加载 IThumbnailProvider 实例时使用的唯一初始化接口(用于隔离目的)。这是所有 IThumbnailCache 代码路径的 Windows 主代码路径。
当第 3 方不使用 IThumbnailCache API 请求处理程序时,可以使用 IInitializeWithItem 或 IInitializeWithFile 初始化缩略图实现,但这并不常见。如果您实现 IInitializeWithItem,Shell 将使用项目的 IShellItem 表示调用 IInitializeWithItem::Initialize。如果您实现 IInitializeWithFile,Shell 使用文件的路径调用 IInitializeWithFile::Initialize。
我相信由于这里提到的安全问题,微软可能已经确保 shell 只会使用IInitializeWithStream
.
我仍在调查是否有某种迂回的方式来获取路径IStream
- 到目前为止,我只能获取显示名称。但是,如果该对象IStream
还实现了其他一些接口,则可以查询它的路径,如果我发现一种方法,我会更新这个答案。
推荐阅读
- asp.net-mvc - 如何处理同一实体类型的多个一对零或一关系?
- jquery - 单击时重定向到当前页面(不重新加载)
- openstack - Redhat OSP13 undercloud 升级失败
- r - R:在插入符号模型和 glm 模型上使用 rms:bootcov 计算引导估计
- python - 我不明白为什么结果是“B 的 __new__() 调用了 A 的 __init__() 调用了 A 的 __new__() 调用”
- javascript - 如何从获取请求 REACT 中引用函数和状态
- sql - 复式记账的关系数据模型
- angular8 - 角度放置请求达到空值
- linq - 如果集合包含满足谓词的元素,LINQ 将返回 true
- python - 5操作python计算器