我正在编写实现IInitializeWithFile
的缩略图提供程序,但是传递给initialize方法的文件路径无效。
"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;
}
最佳答案
从Windows Vista开始,您似乎只能使用IInitializeWithStream
。
我在这里做了一些广泛的测试(请参阅this pull request和this pull request。测试表明,除非服务器实现Initialize
,否则不会调用IInitializeWithStream
方法。
最新的MSDN文档位于:
https://docs.microsoft.com/en-us/windows/win32/api/thumbcache/nn-thumbcache-ithumbnailprovider
似乎也暗示了这一点:
我相信,由于提到了here的安全问题,Microsoft可能已确保 shell 程序仅使用IInitializeWithStream
。
我仍在调查是否有某种回旋方式来从IStream
获取路径-到目前为止,我只能获得显示名称。但是,如果作为IStream
的对象还实现了其他接口(interface),则可能可以向其查询路径,如果发现一种方法,我将更新此答案。