Я действительно надеюсь, что вы можете мне помочь с этим. Это заняло 2 дня. Я попытался отладить, выполнив выполнение в модуле System.variants, но не вижу решения.Delphi XE7 с использованием EmptyParam для открытия Word2010 документа через OLE Auto
Я пытаюсь заставить Delphi XE7 открыть файл .doc в Word 2010 через OLE Automation.
Я установил 16 параметров, готовых для функции Open(), которая указана в файле Word2010.pas (получена из библиотеки типов MSWORD.OLB и поставляется с Delphi XE7 под .. \ OCX \ Servers), затем вызывается он и получить исключение EVariantBadVarTypeError с сообщением: «Недопустимый тип варианта».
Я внимательно следил за спецификацией параметров (я думаю) и не могу понять, что не так.
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;
`
Большое спасибо.
Steve
Зачем вам нужны какие-либо приведения? –
Вы имеете в виду «как _ApplicationDisp» в – SteveF
Вы имеете в виду такие, как .... «как _ApplicationDisp» в «WordApp: = (CoWordApplication.Create as _ApplicationDisp);». ? Он не будет компилироваться, если вы не сравните результат. Или вы имеете в виду что-то еще? В общем, я пытаюсь придерживаться набора объектов «dispinterface». – SteveF