in reply to Win32:OLE - close documents

I doubt that the code you posted is the code that you use. Maybe, if this is the actual code, you are confused about what my does, or go about your way in a very roundabout manner.

Anyway, the main cause of your "problem" is that Word keeps temporary files open as long as your file is opened in Word. You need to actually close the document (or the Word application) so it cleans up its tempfiles. Your naming convention is quite confusing ($doc is a Word.Application object and not a document), so I'll rewrite your code to be closer to what Perl sees:

my $word = Win32::OLE->new('Word.Application', 'Quit'); $word->Documents->Open($path); my $new_name = $path; # Get a handle on the document we just opened, # so we don't need to use ActiveDocument: my $doc = $word->Documents($path); # Set new extension $new_name =~ s!\.fin$!.rtf!i; $doc->SaveAs({ FileName => $new_name, FileFormat => wdFormatRTF }); # Either one of these should work: # Close the document $doc->Close(); undef $doc; # Close Winword $word->Quit(); undef $word;

Replies are listed 'Best First'.
Re^2: Win32:OLE - close documents
by Anonymous Monk on Jan 03, 2005 at 14:41 UTC
    My original code works except for closing the document. I agree that the variable names were not correct for the meaning of the object. It is something for me to keep in mind.

    As for the use of my, how is it incorrect? I am limiting the scope of the variable. My understanding was that that was a primary use of my. I'll go check Learning Perl to make sure.

    Thanks for the help. I really appreciate it.

      You already have the variable $path filled with some value beforehand, but then declare a second variable with the same name, thus overlaying the other variable. This is per se not incorrect, but it is confusing. This is why I chose to rename all the variables to what I interpret their values actually mean.

      I think it may be that your application variable ($doc in your original example) doesn't go out of scope before the global destruction phase. So the WINWORD.EXE instance hangs around until you do

      undef $doc;

      like Corion said, or if $doc is a lexical and leaves it's scope.

      I have had problems with Win32::OLE variables being destroyed during global destruction. The ordering seems to mess things up enough to confuse Win32::OLE.

      /J