我正在编写实现IInitializeWithFile
的缩略图提供程序,但是传递给初始化方法的文件路径无效。
HKCR\CLSID\{CLSID of my thumbnail provider}
)中创建了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;
}
发布于 2019-10-30 12:34:23
似乎您只能在Windows中使用IInitializeWithStream
。
我在这里做了一些广泛的测试(参见此拉请求和此拉请求 )。测试表明,除非服务器实现Initialize
,否则不会调用IInitializeWithStream
方法。
有关MSDN的最新文档,请访问:
https://learn.microsoft.com/en-us/windows/win32/api/thumbcache/nn-thumbcache-ithumbnailprovider
这似乎也意味着:
Shell调用IInitializeWithStream::IInitializeWithStream::initialization,并且IInitializeWithStream是在IThumbnailProvider实例被加载出proc(出于隔离目的)时使用的唯一初始化接口。这是所有IThumbnailCache代码路径的主要代码路径。 在不使用IInitializeWithItem API的情况下,处理程序由第三方请求时,缩略图实现可以使用IThumbnailCache或IInitializeWithFile进行初始化,但这并不常见。如果您实现了IInitializeWithItem,Shell将调用IInitializeWithItem::Initialize,并使用项目的IShellItem表示形式进行初始化。如果实现IInitializeWithFile,Shell将使用文件的路径调用IInitializeWithFile::Initialize。
我相信,由于提到的安全问题,微软可能已经确保了这里只会使用IInitializeWithStream
。
我仍然在调查是否有一些迂回的方式从一个IStream
获得路径-到目前为止,我只能得到显示名称。但是,如果IStream
对象也实现了其他接口,可能会查询它的路径,如果我发现了一种方法,我将更新这个答案。
https://stackoverflow.com/questions/57168578
复制相似问题