【问题标题】:TOleContainer opening .tmp(word2016) documents Delphi7TOleContainer 打开 .tmp(word2016) 文档 Delphi7
【发布时间】:2018-02-08 05:59:27
【问题描述】:

我们正在使用 Delphi 7、SQL server 2008 和 MS word 2003。现在我们计划将 MS word 2003 迁移到 MS word 2016。

在我们的应用程序中,我们将从数据库中加载文档(BLOB 字段)并将其保存到 .tmp 文件中,然后我们将在 Delphi7 中使用 TOleContainer 打开文档。

上述过程适用于 .doc,但不适用于 .docx。我们可以用下面的例子复制这个问题

  1. 创建 .docx 文件
  2. 打开 .docx 文件并输入一些文本并保存并关闭
  3. 将 .docx 重命名为 .tmp
  4. 使用TOleContainer打开.tmp文件(下面的Delphi代码)

德尔福代码:

procedure TForm1.FormShow(Sender: TObject);
begin
  WordOleContainer.AllowInPlace := True;
  WordOleContainer.CreateObjectFromFile('F:\WordViewerTest\docx.tmp', False);
end;

当我们运行应用程序时,我们得到以下错误。如果我们点击打开的文档正在另一个窗口中打开,而不是在 olecontainer 中。

如果我双击 .tmp 文件,它会在没有任何警告的情况下打开。 如果我使用上面的 delphi 代码,它会显示警告。如何使上面的代码工作?

【问题讨论】:

  • @Victoria:它没有任何标题......它只是带有一些文本的普通 .docx 文件。
  • 我知道。我的意思是从二进制的角度来看(如果 *.docx 文件具有唯一的二进制签名)。该主题的第 2 步是您所需要的(第 3 步由于扩展名更改而失败)。关键是如何。 *.doc 扩展名已经在注册表中有这样的条目,因为对于这样的文件,GetClassFile 会返回特定的类 ID,即使您更改了扩展名(即使在我的计算机上,Office 2007,仅供参考)。
  • @Victoria:在注册表中添加了该条目,但我们仍然面临同样的问题。操作系统是 windows 2012 R2。
  • 您不应添加该主题中显示的注册表项。这是一个例子。您需要找到 *.docx 的二进制签名并为其添加条目。或者换句话说,您需要向系统显示一个 *.docx 文件并将其与 Word 应用程序相关联。这就是重点。

标签: delphi delphi-7


【解决方案1】:

只要 *.docx 文件从二进制的角度来看实际上是 *.zip 文件,就无法区分 OLE 二进制模式类搜索机制(在GetClassFile 参考中的第 2 步中描述)确定策略)在这些文件类型之间。如果您为 *.docx 文件注册了二进制模式,您实际上将注册 *.zip 文件以供您选择的应用程序打开。从那时起,所有使用OleCreateFromFile 的程序都会在您注册的应用程序中打开 *.zip 文件。

因此,要解决您的问题而不会在系统中产生任何歧义,只需使用正确的 *.docx 扩展名保存文件,然后让 OLE 通过文件扩展名找到类(确定策略的第 3 步)。

【讨论】:

    猜你喜欢
    • 2015-06-28
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多