From: Frazier, J. J. <Joe.Frazier@PeopleClick.com> - 2001-06-28 23:03:15
|
> -----Original Message----- > From: Morbus Iff [mailto:mo...@di...] > Sent: Thursday, June 28, 2001 17:38 > To: per...@li...; ge...@bi...; > per...@li... > Subject: [perl-win32-gui-users] RE: Opera and "Open Default Browser", > Hard Crash? >=20 >=20 > This is eventually the code I went with, which has > been tested with IE 5/6, Mozilla/Netscape, and Opera. >=20 > ############################################################## > ################=20 > open_url() - open a url in the system's default=20 > browser=20 > ############################################################## > ################=20 > USAGE:=20 > # &open_url( "http://127.0.0.1:8888/" ); =20 > # > # OS SPECIFIC=20 > NOTES: =20 > # This=20 > routine loads the Win32::Shell module to execute the=20 > "open" # command which will open the browser and=20 > load the URL.=20 > However, if the # user has defined a local path to a=20 > browser, we try=20 > to open that instead. # > #=20 > RETURNS:=20 > # 1; we instruct the user to open their browser if we=20 > can't.=20 > ############################################################## > ############### > sub open_url { >=20 > my ($url) =3D @_; >=20 > # we spit out our suggestion just to catch all instances. > ¬e("If your browser doesn't load, go to <$url>", 1); >=20 > # find out what browser we're using. > use Win32::TieRegistry; > my $browser =3D=20 > $Registry->{"Classes\\http\\shell\\open\\command"}->{'\\'}; > ¬e("Your registry states that $browser is your default=20 > program."); >=20 > # if a browser_path hasn't been set, try > # to open the default browser using the native API. > # note, that if the $browser is Opera, we skip > # this part, because Opera uses a Multiple > # Document Interface that crashes us every time. > # instead, we use the "path to browser" code below. > if ( $SETTINGS->{user}->{browser_path} eq "default" > or $browser =3D~ /opera/i ) { > use Win32::API; > my $ShellExecute =3D new Win32::API("shell32", "ShellExecuteA", > ['N','P', 'P', 'P', 'P', 'I'], 'N'); > $ShellExecute->Call(0, "open", $url, 0, 0, 1); > } >=20 > # if a browser_path has been defined, try passing > # the $url to the .exe and hope it understands. > else { >=20 > # if we see "program files" or "internet explorer", we take > # a chance and try to change them to their common eight char > # equivalents. this won't work for all users but covers > # a good large portion of them. yup yup. fun. chicks on speed. > $SETTINGS->{user}->{browser_path} =3D~ s/program=20 > files/progra~1/ig; > $SETTINGS->{user}->{browser_path} =3D~ s/internet=20 > explorer/intern~1/ig; >=20 > ¬e("Trying to load $SETTINGS->{user}->{browser_path}."); > unless ( fork ) {=20 > system("$SETTINGS->{user}->{browser_path} $url"); } > } Note sure if this will work, but you may not have to change your $SETTINGS->{user}->{browser_path} with the regex above. You should be able to=20 system(qq|"$SETTINGS->{user}->{browser_path} ", $url|); Basically, you want something on the command line like=20 c:\some path with spaces\exe.exe argument1 to be=20 "c:\some path with spaces\exe.exe" argument1 This way you dont have to munge the data. Also, if they installed to a path with spaces instead of defaults, if you can get this working, it takes care of all instances.... Just a thought. >=20 > return 1; > } >=20 > 1; >=20 > -- > Morbus Iff ( .sig on other machine. ) > http://www.disobey.com/ && http://www.gamegrene.com/ > "where's there's a will, there's a morbus ready to collect!" >=20 >=20 > _______________________________________________ > Perl-Win32-GUI-Users mailing list > Per...@li... > http://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users >=20 |