Com 如何从内存加载IPersistFile?

Com 如何从内存加载IPersistFile?,com,memory-mapped-files,ifilter,ipersistfile,Com,Memory Mapped Files,Ifilter,Ipersistfile,我在C#中使用IPersistFile加载文件,然后将其作为IFilter读取: IFilter filter = LoadIFilter (fileextension); IPersistFile persistFile = (filter as IPersistFile); if (persistFile != null) { persistFile.Load (fileName, 0); IFILTER_FLAGS flags; IFILTER_INIT iflag

我在C#中使用IPersistFile加载文件,然后将其作为IFilter读取:

IFilter filter = LoadIFilter (fileextension);
IPersistFile persistFile = (filter as IPersistFile);
if (persistFile != null) {
    persistFile.Load (fileName, 0);
    IFILTER_FLAGS flags;
    IFILTER_INIT iflags = IFILTER_INIT.FILTER_OWNED_VALUE_OK;
    if (filter.Init (iflags, 0, IntPtr.Zero, out flags) == IFilterReturnCode.S_OK) {
        return filter; // will be read using GetChunk/GetText
    }
}
这个很好用


但是,我希望从内存而不是磁盘路径加载文件内容。可能吗?IPersistFile接口除了提供路径字符串外,没有其他方式,因此似乎既不能使用内存映射文件,也不能使用字节数组。

作为初步答案草图:我的研究表明,可以强制转换为而不是IPersistFile,后者允许从IStream加载,从而从内存目标加载。

是,所有sane
IFilter
实现都应该实现
IPersistStream
,您可以尝试查询
IPersistStream
并使用它。@sharptooth谢谢,我明白了。因此,IFilter应该实现尽可能多的IPersistX接口,以便在所有情况下都可用。好吧,不是真的,最小的似乎是
IFilter
iPeristFile
iPeristStream
。请注意,一些IFilter只支持一个IPersist*接口。Windows Search在IFilter上使用IPersistStream接口,但不使用IPersistFile。ifilttst使用IPersistFile。一些制造商只实施了一个,目的是限制其可用性。