我正在编写实现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 requestthis 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),则可能可以向其查询路径,如果发现一种方法,我将更新此答案。

    08-28 12:40