首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以用文件初始化IThumbnailProvider对象吗?

我可以用文件初始化IThumbnailProvider对象吗?
EN

Stack Overflow用户
提问于 2019-07-23 16:30:29
回答 1查看 598关注 0票数 2

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

  • 我在注册中心( Registry 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的原因是我需要文件的路径来返回正确的缩略图。

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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对象也实现了其他接口,可能会查询它的路径,如果我发现了一种方法,我将更新这个答案。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57168578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档