问题标签 [istorage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
886 浏览

c++ - VCL 替代 IStorage

作为序言,我使用的是 Borland C++ 和 VCL。

我需要某种结构化存储对象,它可以作为单个文件保存到磁盘,并且可以包含多个命名的二进制数据 blob,我可以通过编程方式枚举、访问和操作这些 blob。

IStorage接口似乎与我想要的很接近,但我更喜欢 VCL 风格的解决方案,因为将 TStream (VCL) 转换为 IStream 会变得很尴尬,而且它们必须是一个更简单的解决方案,使用已经可用的 VCL 东西,比如 TIniFile 但对于二进制数据。

我不想使用 XML,因为二进制数据 blob 非常大,并且当正确编码以在 XML 中使用时,它是完全无效的。

提前感谢所有建议。

0 投票
1 回答
1235 浏览

c# - IStorage 的复合文件实现是线程安全的吗?

我正在使用来自 C# (StgCreateDocfile) 的 IStorage 的复合文件实现。

如果我自己同步读取和写入,从多个线程访问一个 IStorage / IStream 实例是否安全?或者这里是否有任何可能有问题的 COM 问题?

例如,我可以安全地调用 EnumElements 来获取存储中的所有流,同时(并且来自不同的线程)创建和写入一个新流吗?

我已经为我的实现编写了一个压力测试,它没有显示任何问题,但我需要 100% 确定。我在 MSDN 文档中没有找到此信息。

0 投票
2 回答
1730 浏览

c# - 使用 IStorage/IStream 从 C# 拖放到 Windows 资源管理器

我一直在研究听起来很简单的功能太久了。这个想法是我有一个带有 TreeView 的应用程序。此树视图表示组织成文件和文件夹的数据库的内容,与 Windows 资源管理器非常相似。因此,用户应该能够将这些文件/文件夹从我的应用程序中拖到 Windows 资源管理器中,这是有道理的。

IStream我决定如果他们拖动文件或如果他们拖动文件夹,我应该使用IStorage。经过很长一段时间和比我想知道的更多关于 Win32/COM 的学习方式(以及这里一位非常有帮助的人的推动),我终于有了它IStreamIStorage创建了它。

然后我发现要将它传递IStreamIStorage关闭到 Windows 资源管理器,我必须将它放在一个STGMEDIUM. 当然, medium.tymed 将是IStreamor IStorage,这取决于我使用的是哪个,但据我了解,它medium.unionmember必须是指向IStream/IStorage.

我尝试过使用 fixed 关键字(但它当然不是 blittable),我尝试过将爆炸的东西转换为字节数组,但无法想出一种方法来实现这一点,我试过了使用 GCHandle 固定它(但它仍然不是 blittable),以及其他一些不起作用的东西。

所以我的问题是:给定IStorage sand STGMEDIUM m,我如何填充m.unionmember以便 Windows 资源管理器会高兴并接受丢弃?

0 投票
4 回答
3057 浏览

c# - 在 C# 中释放 OLE IStorage 文件句柄

我正在尝试使用此处描述的 OLE 技术将 PDF 文件嵌入 Word 文档: https ://docs.microsoft.com/en-us/archive/blogs/brian_jones/embedding-any-file-type-like- pdf-in-an-open-xml 文件

我试图实现 C# 中提供的 C++ 代码,以便整个项目都在一个地方,并且几乎就在那里,除了一个障碍。当我尝试将生成的 OLE 对象二进制数据输入 Word 文档时,我得到一个 IOException。

IOException:该进程无法访问文件“C:\Wherever\Whatever.pdf.bin”,因为它正被另一个进程使用。

有一个文件句柄打开 .bin 文件(下面的“oleOutputFileName”),我不知道如何摆脱它。我对 COM 知之甚少——我在这里讨论它——而且我不知道文件句柄在哪里或如何释放它。

这是我的 C# 化代码的样子。我错过了什么?

更新 1:澄清了我所说的“.bin 文件”是指哪个文件。
更新 2:我没有使用“使用”块,因为我想要摆脱的东西不是一次性的。(老实说,我不确定我需要释放什么来删除文件句柄,COM 对我来说是一门外语。)

0 投票
1 回答
267 浏览

ms-office - 从内存存储中打开 Office 2007 文档 - 如何?

我是一名 C++ 开发人员,正在努力更新已广泛使用 IStorage 接口从内存存储(通过 ILockBytes)打开 Office 2007 之前的文档的应用程序。

如果到目前为止您仍在关注我,您可能知道新的 Office 文档格式与 IStorage 容器不兼容。我尝试更新的应用程序依赖于所有 Office 应用程序都具有的 IPersistStorage 接口,并且编写的代码调用 IPersistStorage 的 load 方法从 IStorage 接口读取文档。

所以问题是:

什么样的 COM 接口可供我从内存容器中读取 Office 2007 文档?

0 投票
0 回答
455 浏览

winapi - Opening an IStorage from an IStream

I'm implementing a property handler for a structured storage file and would like to initialize it with IInitializeWithStream given its benefits of isolation, handling slow transfer, etc. But I see no obvious way to open an IStorage from an IStream. I don't want to load the whole file into global mem, and the documentation doesn't state whether ILockBytes is necessarily implemented on the IStream passed to Initialize.

Implementing IInitializeWithFile would be easy, but then cannot be isolated.

Any thoughts to how I might be able to get an IStorage from this IStream?

To note, I do not own this file type but for my common work having these extra properties exposed would be helpful.

0 投票
1 回答
73 浏览

sqlite - Firefox 扩展 executeAsync 一次只返回 15 行

我正在开发一个可以读取和写入 sqlite 数据库的 firefox 扩展。我运行了一个异步查询以从数据库中获取 20 行,并且处理数据接收的回调函数被调用了两次。第一次返回 15 行,第二次返回最后 5 行。这是标准值吗?如果是这样,这个值可以改变吗?

0 投票
1 回答
274 浏览

c++ - 在 IStream 实现中保存 MAPI IMsgStore

我正在尝试使用 IMAPISession 方法创建 pst 味精存储:

它使用 prows 中提供的 PR_PST_PATH 属性。

但现在我需要在内存中打开 pst 文件,即使用 IStream 内存流实现。有人试图做类似的事情?

0 投票
1 回答
660 浏览

mapi - 使用 IStorage 时,EML 到 MSG 的转换失败

我正在尝试将 EML 转换为 MSG 文件。我在 IStorage 对象上创建 mapi 对象 IMessage;将 class-id CLSID_Message 分配给 IStorage 对象;解析 EML 文件,读取属性并将它们分配给 mapi IMessage 对象;在 mapi IMessage 对象上调用 Save();在 IStorage 对象上调用 Commit();Outlook 无法读取生成的 MSG 文件。所以我尝试了另一种方法,如下所述。

在 IStorage 上创建了第二个 IMessage 对象;在第一个 IMessage 对象上调用 IMessage::CopyTo(),将数据传输到托管在 IStorage 对象上的第二个 IMessage;OutLook 再次无法读取生成的 MSG 文件。

如果我在 PST 中创建 IMessage 对象,则 OutLook 可以读取生成的 MSG 文件。我认为当我在 IStorage 上创建 IMessage 时发生了一些事情。我能够从 IMessage 对象中读取 PR_SUBJECT,因此发生了 EML->MAPI 转换(此代码已经工作多年)。

这里的代码

请让我知道你们中是否有人有这方面的经验。

谢谢

0 投票
1 回答
544 浏览

windows - 使用 shell API 读取/写入 shell 命名空间扩展中的文件

我使用 SHGetDesktopFolder() 来获取 PIDL,然后使用 IShellFolder 遍历它的内容。

我现在有一个引用文件系统位置的特定 PIDL,我可以使用 BindToStorage 和 IStorage 来 .OpenStream() 和 .Write() 文件。

如果有趣的东西存在于文件系统中,这一切都很好,但更有趣的东西存在于“Shell Namespace Extensions”中。

特别是,我有一个 Pocket PC 2002 设备(特别是 Symbol PDT8146),它使用 Windows Mobile Device Center 连接到我的 Windows 7 机器。这个应用程序创建了一个 shell 命名空间文件夹,我可以在资源管理器中使用它来读取/写入文件。

我不能做的是使用命令行或 win32 API 向其写入文件。

按照我上面概述的策略,我可以获得引用设备的 PIDL 和 IShellFolder 实例,并且可以列出它的文件。但是,当我尝试访问 IStorage 时,IShellFolder.BindToStorage() 失败并显示“不支持此类接口”。

我应该调查另一个 shell 接口来在这个顽固的设备上读/写文件吗?