Delphi XE7使用EmptyParam通过OLE自动打开Word2010文档

Delphi XE7 using EmptyParam to Open Word2010 document via OLE Auto

我真的希望你能帮我解决这个问题。到现在已经用了2天了。我尝试通过执行 System.variants 单元进行调试,但看不到解决方案。

我正在尝试让 Delphi XE7 通过 OLE 自动化在 Word 2010 中打开 .doc 文件。

我为 Word2010.pas 文件中给出的 Open() 函数设置了 16 个参数(派生自 MSWORD.OLB 类型库并与 Delphi XE7 一起提供..\OCX\Servers ) 然后调用它并得到一个 EVariantBadVarTypeError 异常消息:"Invalid variant type".

我已经仔细遵循了参数规范(我认为),但无法找出问题所在。

Word2010.pas序言中有一行: // SYS_KIND: SYS_WIN32 表明(我认为)该单元适用于 32 位情况,因此我在 32 位 Win 目标下进行编译。

这是代码片段:-

`...
uses
Word2010,
Vcl.OleServer,
System.Win.ComObj,
Winapi.OLE2,
System.variants,
Winapi.ActiveX
...

procedure TDocPDF.ExOpenDocument(sDocFile :string);
var
    WordApp : _ApplicationDisp;
    DocumentTemplate  : _DocumentDisp;
    DocsCollection    : DocumentsDisp;
    vTemplate : OleVariant;
    vVisible : OleVariant;
    vOpenFormat : OleVariant;
    vConfirmConversions,
    vReadOnly ,
    vAddToRecentFiles,
    vPasswordDocument,
    vPasswordTemplate,
    vRevert,
    vWritePasswordDocument,
    vWritePasswordTemplate ,
    vEncoding : OleVariant;
    vOpenAndRepair : OleVariant;
    vDocumentDirection : OleVariant;
    vNoEncodingDialogue : OleVariant;
    vXMLTransform : OleVariant;

begin
// load a copy of Word 2010:
CoInitialize(nil);
WordApp := (CoWordApplication.Create as _ApplicationDisp);
WordApp.Visible := bVisible;
DocsCollection := WordApp.Documents as DocumentsDisp;

// set up the parameters for the .Open command:
vTemplate := sDocFile ;
vVisible := False;
vConfirmConversions:=false;
vReadOnly :=False;
vAddToRecentFiles:=False;
vPasswordDocument:=EmptyParam;
vPasswordTemplate :=EmptyParam;
vRevert:=False;
vWritePasswordDocument:=EmptyParam;
vWritePasswordTemplate:=EmptyParam;
vOpenFormat:=wdOpenFormatAuto;
vEncoding:=EmptyParam;
vOpenAndRepair:=EmptyParam;
vNoEncodingDialogue:=EmptyParam;
vDocumentDirection:=EmptyParam;
vXMLTransform:=EmptyParam;

try
   DocumentTemplate := DocsCollection.Open(vTemplate,
      vConfirmConversions,
      vReadOnly,
      vAddToRecentFiles,
      vPasswordDocument,
      vPasswordTemplate,
      vRevert,
      vWritePasswordDocument,
      vWritePasswordTemplate,
      vOpenFormat,
      vEncoding,
      vVisible,
      vOpenAndRepair,
      vDocumentDirection,
      vNoEncodingDialogue,
      vXMLTransform) as _DocumentDisp;
except on e: exception do begin
   Application.MessageBox(PChar('Problem':'+E.message),                             PChar('ExOpenDocument'), MB_OK);
end;
end;

`

非常感谢。

史蒂夫

在我看来,这似乎比实际需要的要复杂。我会这样写:

var
  App: WordApplication;
  Docs: Documents;
  Doc: WordDocument;
....
App := CoWordApplication.Create;
App.Visible := True;
Docs := App.Documents;
Doc := Docs.Open( 'C:\desktop\temp.docx', EmptyParam, EmptyParam, EmptyParam, 
  EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, 
  EmptyParam, EmptyParam);