Newsgroup: it.comp.lang.perl
Titolo: COME DIVENTA IN PERL!?

Ciao, qualcuno sa come TRASFORMARE questo codice di MacroWord in PERL !?!?
------------------------------
On Error Resume Next
Open "D:\TEST.doc" For Binary Access Read Lock Read As #1
Close #1
filelocked = False
If Err.Number <> 0 Then
    filelocked = True
    Err.Clear
   End If
 
 If (filelocked = True) Then
    MsgBox ("LOCCATO")
  End If
------------------------

,
scriveva:

Mi pare che l'interfaccia VBA di Word non abbia l'oggetto Err (mi
aspetterei di trovarlo fra le proprietà di Application, ma non c'è) e, come
ho già detto, la documentazione non è chiarissima su che cosa succeda
quando il metodo Open fallisce (che cosa venga restituito, ecc).
In perl si potrebbe tentare qualcosa come:
    use Win32::OLE;
    use Win32::OLE::Const;
    my $Word = new Win32::OLE("Word.Application","Quit") or
            die "Can't start Word: $!";
    my $WordConst=Win32::OLE::Const->Load("Microsoft Word");
    $Word->{DisplayAlerts} = $WordConst->{wdAlertsNone};
    my $word_docs = $Word->{Documents};
    my $word_doc;
    my $un_doc = "D:\\TEST.doc";
    eval {$word_doc = $word_docs->Open($un_doc,,-1,,,,0)};
    if (!defined $word_doc or $word_docs->{Count} <= 0) {
       print STDERR "Impossibile aprire: ", $un_doc, "\n";
       if (defined $word_doc) {
           $word_doc->Close(0);
       }
       return;
    }
Copiato da un mio script, potrebbe esserci qualcosa di più e qualcosa di
meno rispetto al codice in MacroWord, ma gestisce (o ci prova) l'errore di
apertura.
Come già detto in altra occasione, comunque, porsi il problema di
"trasformare" il codice macro di Word, quasi si potesse fare riga per riga,
non è particolarmente corretto. Come in ogni buona traduzione, si tratta
innanzitutto di capire che cosa viene detto, e dirlo nella nuova lingua;
fondamentale è quindi in questo caso la comprensione delle classi di
oggetti rese disponibili dall'interfaccia, oltre che una buona conoscenza
di perl.
Ciao.

...


...


mi interessa.
Aperti da chi e dove? Per quello che capisco, la cosa, come ho detto,
funzionerebbe solo se accedi alla medesima istanza di Word che ha aperto i
documenti.
Ciao.

 come diventa in PERL!?
Dovrebbe essere qualcosa come
   $Windows->{""TEST.DOC"}->Activate();
supponendo che in $Windows tu abbia già messo l'oggetto Windows.
Ma mi pare che abbia un senso solo se hai modo di accedere alla stessa
istanza di Word in cui il documento è aperto.
Ciao.

...


Idee!?!?
Nessuna oltre a quelle che già ti ho detto, e non molto tempo per
verificare né queste né altre. Se mi riesce di farlo nei prossimi giorni,
pubblico magari qualcosa.
Se esegui qualcosa che sai che può fallire, può essere conveniente farlo
con eval {...}:
   ....
   eval {$Document=$word->Documents->Open($ARGV[0],0,0)} ||
   fai_qualcosa_anche_non_die;
   ....
Questo ti consente un controllo maggiore sugli errori.
Ciao.

  $Windows->Item('TEST.doc')->Activate();
Entrambi di fatto funzionano; naturalmente, bisogna lavorare su un'istanza
di Word già in esecuzione, non avviarne una nuova:
   use Win32::OLE;
   my $word=Win32::OLE->GetActiveObject('Word.Application.8');
   my $Windows = $word->{'Windows'};
   $Windows->{'TEST.doc'}->Activate();
   $Windows->{'TEST.doc'}->{Selection}->InsertAfter('Prova');
Ciao.

...


La soluzione e' proprio questa, ci sono arrivato ieri nel pomeriggio.
Boh.... ti avevo già accennato che bisognava accedere alla stessa istanza
di Word che ha aperto il file, e che in qualche caso funzioni, non ho
dubbi; che sia "La soluzione" del problema proposto, così come è stato
proposto, francamente mi riesce difficile crederlo.
Win32::OLE->GetActiveObject accede ad un'istanza attiva nella medesima
sessione utente e, per quello che so, mi auguro e spero, non c'è nulla che
possa accedere all'istanza attiva in un altro spazio utente, e men che meno
su un altro computer che accede al file attraverso la rete; e se anche
fosse possibile (spero di no), mi è difficile pensare ad un sistema per
conoscere a priori a quale istanza bisogna accedere.
Tentare direttamente l'apertura, e gestire il fallimento, continua a
sembrarmi la cosa più ragionevole da fare.
Devo comunque evidentemente rassegnarmi al fatto che tu sappia meglio di me
qual è il problema che vuoi risolvere, e quindi sappia riconoscerne meglio
di me la soluzione.
Ciao.