Solved

Win32::OLE(0.1702) error 0x800706be: "The remote procedure call failed"

Posted on 2009-04-08
5
2,170 Views
Last Modified: 2012-05-06
I am writing a small perl code for opeining two excel files simultaneously.  When I ran the script it's opening the first file successfully and when it came to open second file. it's throwing the above mentioned error.
#use strict;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3;
sub getdata;
$path1 = "C:\\edu\\Test.xls"; #first file
$pointer = &getdata($path1);
foreach $value1 (@$pointer) {
	foreach $value2 (@$value1){
		print $value2;
		print "\n";
	}
}
 
$path2 = "c:\\edu\\Test2.xls"; #second file
$pointer1 = &getdata($path2);
foreach $value3 (@$pointer1) {
	foreach $value4 (@$pointer2) {
		print $value4;
		}
	}
sub getdata {
my ($path) = @_;
 # get already active Excel
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
    || Win32::OLE->new('Excel.Application','quit');                                                      # application or open new
my $Book = $Excel->Workbooks->Open($path); # open Excel file
my $Sheet = $Book->Worksheets(1);                     # select worksheet number 1
my $array = $Sheet->Range("A1:B2")->{'Value'};        # get the contents
$Book->Close;
return ($array);
}

Open in new window

0
Comment
Question by:deshaw
  • 2
  • 2
5 Comments
 
LVL 25

Accepted Solution

by:
lwadwell earned 500 total points
ID: 24104385
Hi deshaw,

I think your problem is related to creating the WIN32::OLE object inside the sub-routine ... after it is first called it is destroyed on exit and that it cannot be used again.  Possibly by itself doing an Unitialize.

From WIN32::OLE help page:
"
Win32::OLE->Uninitialize
    The Uninitialize() class method uninitializes the OLE subsystem. It also destroys the hidden top level window created by OLE for single threaded apartments. All OLE objects will become invalid after this call! It is possible to call the Initialize() class method again with a different apartment model after shutting down OLE with Uninitialize().
"

I reworked your script to create the OLE object outside the sub-routine and pass it in and it seems to be fine ...


lwadwell
#use strict;
use Win32::OLE qw(in with);
use Win32::OLE::Const 'Microsoft Excel';
$Win32::OLE::Warn = 3;
sub getdata; 
my $Excelobj = Win32::OLE->GetActiveObject('Excel.Application')
        || Win32::OLE->new('Excel.Application','quit');                                                      # application or open new 
$path1 = "c:\\edu\\Test.xls"; #first file
$pointer = &getdata($Excelobj,$path1);
foreach $value1 (@{$pointer}) {
      foreach $value2 (@{$value1}){
            print $value2;
            print "\n";
      }
}
 
$path2 = "c:\\edu\\Test2.xls"; #second file
$pointer1 = &getdata($Excelobj,$path2);
foreach $value3 (@{$pointer1}) {
      foreach $value4 (@{$value3}) {
            print $value4;
            }
      }
sub getdata {
    my ($Excel,$path) = @_;
    # get already active Excel
    my $Book = $Excel->Workbooks->Open($path); # open Excel file
    my $Sheet = $Book->Worksheets(1);                     # select worksheet number 1
    my $array = $Sheet->Range("A1:B2")->{'Value'};        # get the contents
    $Book->Close;
    return ($array);
}

Open in new window

0
 
LVL 1

Author Comment

by:deshaw
ID: 24107360
It's working fine. Thanks.
0
 
LVL 1

Author Comment

by:deshaw
ID: 24107435
One more question. Where can we find more information about what win32::OLE is exactly doing and how it is querying information.
0
 
LVL 25

Expert Comment

by:lwadwell
ID: 24112007
deshaw,

I do not know much more than what is written up in its man page http://search.cpan.org/~jdb/Win32-OLE-0.1709/lib/Win32/OLE.pm, sorry.  It is using Microsoft's OLE extensions - perhaps other experts can help or search the www.

lwadwell
0
 
LVL 39

Expert Comment

by:Adam314
ID: 24126622
When you use Win32::OLE like this, you are calling actual Excel functions.  You can look at the Excel help for details on what the functions do in Excel.
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

A year or so back I was asked to have a play with MongoDB; within half an hour I had downloaded (http://www.mongodb.org/downloads),  installed and started the daemon, and had a console window open. After an hour or two of playing at the command …
Checking the Alert Log in AWS RDS Oracle can be a pain through their user interface.  I made a script to download the Alert Log, look for errors, and email me the trace files.  In this article I'll describe what I did and share my script.
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.

778 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question