首页 > 解决方案 > 我可以用文件初始化 IThumbnailProvider 对象吗?

问题描述

我正在编写一个实现的缩略图提供程序IInitializeWithFile,但是传递给初始化方法的文件路径无效。

我不能使用的原因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;
}

标签: c++winapicomthumbnails

解决方案


看来您只能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还实现了其他一些接口,则可以查询它的路径,如果我发现一种方法,我会更新这个答案。


推荐阅读