用 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# 应用程序批量下载所有这些文档,但我找不到方法。我曾尝试使用SqlDataReader
、MemoryStream
和FileStream
将二进制数据复制到一个新文件中,但他们直接解释了这些信息,而不是以 OLE 构造它们的方式。因此,生成的文件已损坏。
是否有可以正确解释此 OLE 二进制文件的类?旧应用程序使用了 OLE Container 组件,但几年后它们就不存在了。
【问题讨论】:
你是在说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(位图)对象,我的代码有啥问题?