【发布时间】: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。我们可以用下面的例子复制这个问题
- 创建 .docx 文件
- 打开 .docx 文件并输入一些文本并保存并关闭
- 将 .docx 重命名为 .tmp
- 使用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 应用程序相关联。这就是重点。