Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 2384
  • Last Modified:

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

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
deshaw
Asked:
deshaw
  • 2
  • 2
1 Solution
 
lwadwellCommented:
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
 
deshawAuthor Commented:
It's working fine. Thanks.
0
 
deshawAuthor Commented:
One more question. Where can we find more information about what win32::OLE is exactly doing and how it is querying information.
0
 
lwadwellCommented:
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
 
Adam314Commented:
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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now