【问题标题】:Strip OLE header information (MS Access / SQL Server)剥离 OLE 标头信息(MS Access / SQL Server)
【发布时间】:2025-11-27 04:10:01
【问题描述】:

我有一个需要支持二进制数据库内容(图像等)的 C++ 应用程序。当使用 MS Access 或 MS SQL Server 时,此数据被包装在 OLE 对象中。如何剥离此 OLE 标头信息?请注意,我不能只查找特定标签的开头,因为内容可以是 png、jpg 和一大堆其他格式。我应该使用 COleDataObject 之类的东西吗?

【问题讨论】:

  • 不要使用 OLE 字段,只使用常规 BLOB。

标签: c++ ms-access ole


【解决方案1】:

使用 MS Access 2007(我需要测试其他 MS 数据库)格式似乎是:

84 bytes
file name + \0
full path + \0
5 bytes + [2] bytes (the third byte of those five bytes)
temp path + \0
4 bytes
actual data (if not using a link to the file)

到目前为止,我只是在实际数据之前解析和剥离部分,但我仍然想知道是否没有办法使用 COleDataSource 之类的东西来帮助更稳健地解析这些信息。

另请注意,此格式仅适用于通用内容(开始标记 0x15 0x1c 0x32)。使用位图时(起始标签 0x15 0x1c 0x2f)有 78 个字节的固定偏移量,而使用 PowerPoint 时(起始标签 0x15 0x1c 0x34)有 95 个字节的固定偏移量。

【讨论】:

  • 不是理想的解决方案,但我还没有找到更好的答案。
  • 我们确定 OLE 包装器总是相同的吗?
  • 对于 MS Access 2007,我测试了多种文件类型(gif、bmp、jpg、tiff、png、avi.mpg、swf、...)和“保留”格式。不幸的是,我无法轻松访问其他 MS 数据库系统,因此我还无法验证它们。
【解决方案2】:

请参阅 Stephen Lebans OleToDisk 代码。请注意,代码在 VBA 中。另外我不知道这会像在 SQL Server 中一样工作。

【讨论】:

    【解决方案3】:

    我正在转发我的评论作为答案:

    不要使用 OLE 字段,只需使用常规 BLOB。

    【讨论】:

    • 如果可以的话我会的 :-) 不幸的是我无法控制问题的那一部分(其他人/软件编写数据库,我只需要阅读它)。