用 C# 读取 OLE 对象

Posted

技术标签:

【中文标题】用 C# 读取 OLE 对象【英文标题】:Read OLE object with C# 【发布时间】:2017-07-28 18:19:45 【问题描述】:

我有一个用 Visual Basic 制作的旧应用程序,可以将文档作为 OLE 对象上传和下载。将其检索到 SQL Server 数据库,该数据库将它们存储在 varbinary(max) 字段中。但是,这些 bin 的格式与常规文件不同,因为 OLE 以自己的方式构建它们。

我想通过使用 SQL 的 .NET C# 应用程序批量下载所有这些文档,但我找不到方法。我曾尝试使用SqlDataReaderMemoryStreamFileStream 将二进制数据复制到一个新文件中,但他们直接解释了这些信息,而不是以 OLE 构造它们的方式。因此,生成的文件已损坏。

是否有可以正确解释此 OLE 二进制文件的类?旧应用程序使用了 OLE Con​​tainer 组件,但几年后它们就不存在了。

【问题讨论】:

你是在说OLE Structured Storage 还是直接说IPersistStorage 如果是 OSS,那么假设您可以将 varbinary 保存到磁盘,您可以使用 Microsoft 的 OLE SS 查看器之类的工具从古代版本的档案中查看此 c++ 示例msdn.microsoft.com/en-us/library/windows/desktop/…。还有一篇不错的文章here 我尝试使用 OSS Viewer 打开一个包含 varbinary 的文件,但它不让我打开它,说它不是结构化存储文件。 我认为最简单的方法是让您在数据库上创建一个小文件,将生成的 varbinary 转储到某个地方,然后希望有人知道如何打开它 【参考方案1】:

这是一个从未得到答复的旧帖子。我自己也有类似的情况,我需要拍摄图像并将它们转换为 OLE 文件,以便 Microsoft Access OLE Bound Frames 可以读取它们。我已经研究了几天,现在才发现我需要的二进制格式,即复合文件......或结构化文件。他们有这个 Nuget 包可用,它应该可以完成我们都需要的东西:OpenMCDF

我仍在尝试弄清楚如何从原始二进制文件创建复合文件......但我觉得我很接近并且会在我得到它时发布解决方案。

更新:我正在从事的项目不应该如此参与。因此,在尝试了几天不同的建议之后,我不想再浪费时间了。因此,我最终创建了一个我从不希望重复的完整 hack。以下是我使用的步骤:

    我设置了一个带有最大化窗口的表单,以通过计时器间隔一个一个地显示每个图像。 在每个时间间隔内,我都会对图像进行编程屏幕截图(打印屏幕),并使用可识别的命名约定将它们保存在单独的文件夹中。

那部分全部在 VBA 中完成。

    在文件夹中完成全屏拍摄后,我使用 PhotoShop 将所有图像批量裁剪为精确的图像尺寸。

是的,是的,但它完成了我所需要的……多么痛苦!

【讨论】:

如果仍然感兴趣:查看我的新答案中提供的链接。

以上是关于用 C# 读取 OLE 对象的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio C# 中从 MS Access 数据库中获取 OLE(位图)对象,我的代码有啥问题?

将 ole 文件另存为 office 文档

从 DataTable C# 添加到 OLE 类型表

用DELPHI写一个代码,将EXCEL文件读取成TXT文本

在C# winform中使用 richtextbox 向access保存及读取 图文混排数据(有源码,帮忙改一下)

链接表 OLE 对象在记录集中显示为空,而在查询视图中显示为 OLE 对象