CGI/Perl Guide | Learning Center | Forums | Advertise | Login
Site Search: in

  Main Index MAIN
INDEX
Search Posts SEARCH
POSTS
Who's Online WHO'S
ONLINE
Log in LOG
IN

Home: Perl Programming Help: mod_perl:
mod_perl with Win32::OLE

 



iksaIT
New User

Aug 25, 2009, 1:15 PM

Post #1 of 1 (9632 views)
mod_perl with Win32::OLE Can't Post

Can anybody explain difference between first and second call of the same web page pointed to same mod perl location.
The test was done on a windows xp machine running Apache server version 2.2.11, mod perl version 2.0.4 using perl version 5.10.0

mod perl section in the httpd.conf file is:
LoadFile "c:/Apache2/bin/libapreq2.dll"
LoadModule apreq_module modules/mod_apreq2.so
PerlRequire "C:/Apache2/conf/extra/startup.pl"
<Files *.pl>
SetHandler perl-script
PerlResponseHandler ModPerl::Registry
Options +ExecCGI
PerlOptions +ParseHeaders
</Files>
erlModule Apache2::Hello
<Location /hello>
SetHandler modperl
PerlResponseHandler Apache2::Hello::ResponseH
</Location>

mod perl startup script startup.pl is:

use Apache::DBI ();
use ModPerl::Util (); #for CORE::GLOBAL::exit
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::RequestUtil ();
use Apache2::ServerRec ();
use Apache2::ServerUtil ();
use Apache2::Connection ();
use Apache2::ConnectionUtil ();
use Apache2::Log ();
use APR::Table ();
use ModPerl::Registry ();
use Apache2::Const -compile => ':common';
use APR::Const -compile => ':common';
use Apache2::Cookie;
use Apache2::Directive ();
use CGI ();
Apache2::ServerUtil->server->push_handlers(PerlChildInitHandler => \&ChildInitH);
Apache2::ServerUtil->server->push_handlers(PerlChildExitHandler => \&ChildExitH);

sub ChildInitH {

require Win32::OLE;
require Win32::OLE::Enum;
my($child_pool, $s) = @_;
$s->log_error("child initialize");
Win32::OLE->Initialize( 2 );

# use existing instance if Word is already running
eval {$wd = Win32::OLE->GetActiveObject('Word.Application')};
unless (defined $wd) {
$wd = Win32::OLE->new('Word.Application', sub {$_[0]->Close;})
or return Apache2::Const::SERVER_ERROR;
}
return Apache2::Const::OK;
}

sub ChildExitH {
if (defined $wd) {
$wd->Close(0);
}
Apache2::ServerUtil->server->log_error("child uninitialize");
Win32::OLE->Uninitialize( );
return Apache2::Const::OK;
}
1;

mod perl script Apache2/Hello.pm is:
package Apache2::Hello;
sub ResponseH {
my $r = shift;
$r->content_type('text/html');
$r->print( "<html><body>dump word document on the mod perl way<br>");
$r->print( "bookmarks:<br>");

my $document;
my $wdoc = "c:\\test\\a.doc";
$document = Win32::OLE ->GetObject($wdoc);
my $bookmarks = $document->Bookmarks();
my $enumerate = new Win32::OLE::Enum($bookmarks);
while(defined(my $bookmark = $enumerate->Next()))
{
my $name = $bookmark->{Name};
$r->print("$name<br>");
}
$document->Close(0);
$r->print( "</body></html>");
return Apache2::Const::OK;
}
1;

cbi-bin perl script wc.pl is:
use strict;
require Win32::OLE;
require Win32::OLE::Enum;

print "Content-type: text/html\n\n";
print "<html><body>dump word document on the cgi way<br>bookmarks:<br>";

Win32::OLE->Initialize(2 );

my $wdoc = "c:\\test\\a.doc";
my $document = Win32::OLE -> GetObject($wdoc);
my $bookmarks = $document->Bookmarks();
my $enumerate = new Win32::OLE::Enum($bookmarks);
while(defined(my $bookmark = $enumerate->Next()))
{
my $name = $bookmark->{Name};
print "$name<br>";
}
$document->Close(0);
print "</body></html>"

Both scripts cgi-bin script wc.pl and mod perl script Apache2/Hello.pm list bookmarks from the word document.
When mod perl script is invoked first time after http server started it fails with an error message: "can't locate object method "GetObject" via package "Win32::OLE" "
In the case when cgi-bin address is requested first then mod perl script runs just fine.
I'm wondering why mod perl script fails first time is invoked.
any suggestion

 
 


Search for (options) Powered by Gossamer Forum v.1.2.0

Web Applications & Managed Hosting Powered by Gossamer Threads
Visit our Mailing List Archives