win32: OLE-вызовы Word не работают с visible = 0, удаленный скрипт через SSHD - PullRequest
1 голос
/ 28 июля 2011

Удаленный доступ к учетной записи администратора Windows 2008 R2 / perl 5.14.1 x64 / Word 2010 с использованием ssh to WinSSHD, работающей на Windows Server. Этот Perl-скрипт отлично работает из командной строки (local, Admin):

use warnings;
use strict;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft.Word';    # wd  constants
use Win32::OLE::Const 'Microsoft Office 14.0 Object Library';  # mso constants
use Win32::OLE qw( in with );
my $word = CreateObject Win32::OLE 'Word.Application' or die $!;
$word->{'Visible'} = 0; # note, for debugging only; otherwise use 0
print ">> Creating a new document\n";
my $document = $word->Documents->Add;
with(   $document->{BuiltinDocumentProperties},
Title => "OLE Word Perl",
Author => "Car Friedberg",
Subject => "simple example" );
print ">> Creating a selection at insertion point\n";
# selection is the insertion point.
my $selection = $word->Selection;

print ">> Insert text \n";
$selection->TypeText("This is a test.");
$selection->TypeParagraph;
$selection->TypeText( "End of test.");

print ">> Save document \n";
# save the document (works with Word 2010) (could use wdFormatPDF or wdFormatRTF)
$word->ActiveDocument->SaveAs({
FileName => 'exampletext.doc',
FileFormat =>  wdFormatDocument,
LockComments => msoFalse,
Password => "", 
AddToRecentFiles =>  msoFalse,
    WritePassword => "", 
    ReadOnlyRecommended => msoFalse, 
    EmbedTrueTypeFonts =>  msoFalse, 
    SaveNativePictureFormat => msoFalse, 
    SaveFormsData => msoFalse,
    SaveAsAOCELetter => msoFalse});

$word->ActiveDocument->Close(wdDoNotSaveChanges);
$word->Quit();`

Вывод удаленной оболочки выглядит следующим образом:

C:\Users\Administrator>perl -w \winbat\ole_example.pl
>> Creating a new document
>> Creating a selection at insertion point
>> Insert text >> Save document
OLE exception from "Microsoft Word":Command failedWin32::OLE(0.1709) error 0x800a1066
in METHOD/PROPERTYGET "SaveAs" at \winbat\ole_example.pl line 34

Есть намеки? Я понял, что проблема связана с использованием свойства word {visible} = 0, которое должно быть настроено для удаленного запуска. В одном сообщении, которое я обнаружил, предлагалось использовать полную версию Microsoft Office для создания объекта приложения word, но я не мог понять, как перевести это в нечто, что win32 :: OLE примет, т.е. Microsoft.Office.Interop.Word.ApplicationClass createobject («Word.Application») (Я не смог найти конкретное предложение, но оно не было ошибкой).

Спасибо за любую помощь

1 Ответ

1 голос
/ 28 июля 2011

Одна точка - FileName => 'exampletext.doc' - это не абсолютный путь ... возможно, он пытается сохранить где-то, ему не разрешено или недостаточно места ...

Что может быть связано с этой точкой:WinSSHD работает как сервис?Если да, то автоматизация офиса НЕ поддерживается в соответствии с MS - см. http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

...