From: Thomas, T. B <tim...@lm...> - 2001-01-15 16:16:18
|
Sean -=20 Hey - that's pretty cool. I hadn't thought of taking that angle. I = noticed a problem or two with your code. The main one was that if your = association is pointing to something like "C:\Program Files\Windows = NT\Accessories\WORDPAD.EXE", it doesn't like it because of the space in = "Program Files". So I modified your code a little. I also put in some = debugging stuff to make it easier to see what's going on. Below is the = output on a bunch of different associations, all are coming out ok.=20 I am not sure I like your use of split on getting everything up to the = first space, but I couldn't figure out how to get everything up to the = first space using a regular expression. If you do something like = ($cmd)=3D$command=3D~/^(.*)\s/; it gives you everything up to the last = space, which is annoying, I am sure there is a way around it. Let me know your thoughts on it. Also- How is Win32::TieRegistry different from Win32::Registry? Tim .html=3D"C:\PROGRA~1\Plus!\MICROS~1\iexplore.exe" .htm=3D"C:\PROGRA~1\Plus!\MICROS~1\iexplore.exe" .txt=3D"C:\Program Files\Windows NT\Accessories\WORDPAD.EXE" .pl=3DC:\Perl\bin\Perl.exe .doc=3D"C:\Program Files\Microsoft Office\Office\winword.exe" .xls=3D"C:\Program Files\Microsoft Office\Office\excel.exe" .ppt=3D"C:\Program Files\Microsoft Office\Office\PowerPnt.exe" .log=3D"C:\Program Files\Windows NT\Accessories\WORDPAD.EXE" .url=3Drundll32.exe .jpg=3DC:\PROGRA~1\PAINTS~1\psp.exe .gif=3DC:\PROGRA~1\PAINTS~1\psp.exe .avi=3D"C:\Program Files\Windows Media Player\mplayer2.exe" .wav=3D"C:\Program Files\Netscape\Communicator\Winamp\winamp.exe" Here's the code: use Win32::TieRegistry; check(".html"); check(".htm"); check(".txt"); check(".pl"); check(".doc"); check(".xls"); check(".ppt"); check(".log"); check(".url"); check(".jpg"); check(".gif"); check(".avi"); check(".wav"); sub check { ($item)=3D@_; $prog=3DgetProgram($item); print "$item=3D$prog\n"; }=09 sub getProgram { if (my $ext =3D $_[0]) { if (my $typeName =3D $Registry->{"HKEY_CLASSES_ROOT\\$ext\\\\"}) { if (my $command =3D = $Registry->{"HKEY_CLASSES_ROOT\\$typeName\\shell\\open\\command\\\\"}) { my ($cmd); #print "\tcommand=3D$command\n"; if ($command=3D~/^".*"\s+.*$/) { ($cmd)=3D$command=3D~/^(".*")\s+.*$/; return $cmd; } else { split(/ /, $command); return $_[0]; } } else { return 0; } } else { return 0; } } else { return 0; } } ------------------------------------------------------------------------= ------------------------- Tim Thomas Unix Systems Administrator Lockheed Martin EIS =B7 Denver Data Center 303-430-2281 mailto:tim...@lm... ------------------------------------------------------------------------= ------------------------- -----Original Message----- From: Sean Healy [mailto:jal...@ho...] Sent: Saturday, January 13, 2001 9:13 AM To: per...@li... Subject: [perl-win32-gui-users] Getting the browser Due to a message earlier this week, I was thinking about the problem of = getting a browser preference from the user's registry, so I wrote this: use Win32::TieRegistry; sub getProgram { if (my $ext =3D $_[0]) { if (my $typeName =3D $Registry->{"HKEY_CLASSES_ROOT\\$ext\\\\"}) { if (my $command =3D=20 $Registry->{"HKEY_CLASSES_ROOT\\$typeName\\shell\\open\\command\\\\"}) { split(/ /, $command); return $_[0]; } else { return 0; } } else { return 0; } } else { return 0; } } You pass in the extension and this returns the path to the associated=20 program. The extension must include the dot (i.e, pass in '.html', not = 'html'). This works on my machine, and you're welcome to use it (or modify it to = make=20 it work on your system). It does some basic error checking (makes sure = you pass in an extension, makes sure the extension exists in the registry, = makes=20 sure the file type has a command associated with it). I have not = tested=20 case sensitivity (I know Windows is not case-sensitive as far as file = names=20 go, but I don't know if the same applies to the registry). I'd be glad to hear any feedback. _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com _______________________________________________ Perl-Win32-GUI-Users mailing list Per...@li... http://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users |
From: Sean H. <jal...@ho...> - 2001-01-15 16:55:04
|
Tim- Thanks for the suggestions. I changed this piece: > my ($cmd); > #print "\tcommand=$command\n"; > if ($command=~/^".*"\s+.*$/) > { > ($cmd)=$command=~/^(".*")\s+.*$/; > return $cmd; > } > else > { > split(/ /, $command); > return $_[0]; > } to this: my ($cmd); ($cmd) = $command=~/^(\S*)\s/; return $cmd; which should solve both problems. '\S' matches any non-whitespace character, including quotes. I ran it on my system and it works. > Also- How is Win32::TieRegistry different from Win32::Registry? The Win32::Registry documentation says this: NOTE: This module provides a very klunky interface to access the Windows registry, and is not currently being developed actively. It only exists for backward compatibility with old code that uses it. For more powerful and flexible ways to access the registry, use Win32::TieRegistry. Thanks again for your suggestions. _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com |
From: Thomas, T. B <tim...@lm...> - 2001-01-15 17:04:28
|
Same problem, here's the output I am getting with your new regular = expression: .html=3D"C:\PROGRA~1\Plus!\MICROS~1\iexplore.exe" .htm=3D"C:\PROGRA~1\Plus!\MICROS~1\iexplore.exe" .txt=3D"C:\Program .pl=3DC:\Perl\bin\Perl.exe .doc=3D"C:\Program .xls=3D"C:\Program .ppt=3D"C:\Program .log=3D"C:\Program .url=3Drundll32.exe .jpg=3DC:\PROGRA~1\PAINTS~1\psp.exe .gif=3DC:\PROGRA~1\PAINTS~1\psp.exe .avi=3D"C:\Program .wav=3D"C:\Program it's not pulling anything after the space. We need some kind of regular = expression that says "Everything up to the first space unless that space is in quotes" This doesn't apply to .html because the association is using the short = path (at least for me) but for those extensions that use the long path, it's a problem. ------------------------------------------------------------------------= ------------------------- Tim Thomas Unix Systems Administrator Lockheed Martin EIS =B7 Denver Data Center 303-430-2281 mailto:tim...@lm... ------------------------------------------------------------------------= ------------------------- -----Original Message----- From: Sean Healy [mailto:jal...@ho...] Sent: Monday, January 15, 2001 9:55 AM To: per...@li...; tim...@lm... Subject: RE: [perl-win32-gui-users] Getting the browser Tim- Thanks for the suggestions. I changed this piece: > my ($cmd); > #print "\tcommand=3D$command\n"; > if ($command=3D~/^".*"\s+.*$/) > { > ($cmd)=3D$command=3D~/^(".*")\s+.*$/; > return $cmd; > } > else > { > split(/ /, $command); > return $_[0]; > } to this: my ($cmd); ($cmd) =3D $command=3D~/^(\S*)\s/; return $cmd; which should solve both problems. '\S' matches any non-whitespace=20 character, including quotes. I ran it on my system and it works. > Also- How is Win32::TieRegistry different from Win32::Registry? The Win32::Registry documentation says this: NOTE: This module provides a very klunky interface to access the = Windows=20 registry, and is not currently being developed actively. It only exists = for=20 backward compatibility with old code that uses it. For more powerful = and=20 flexible ways to access the registry, use Win32::TieRegistry. Thanks again for your suggestions. _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com _______________________________________________ Perl-Win32-GUI-Users mailing list Per...@li... http://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users |
From: Eric B. <er...@eb...> - 2001-01-15 18:09:12
|
On Mon, 15 Jan 2001, Thomas, Timothy B wrote: > Same problem, here's the output I am getting with your new regular > expression: > my ($cmd); > ($cmd) = $command=~/^(\S*)\s/; > return $cmd; How about this: my $command_with_args; my $match_nonspace_expect_in_quotes = qr/((?:"[^"]+"|[^ "]+)+)/; $command_with_args =~ /$match_nonspace_expect_in_quotes/; my $command_part = $1; $command_part =~ s/"//g; # Remove quotes return $command_part; # # This works with examples like # '"C:\Program Files\"com"mand".exe "%1"'; # - Eric B. -- "An intelligent carrot! It boggles the mind." |
From: Sean H. <jal...@ho...> - 2001-01-15 17:47:02
|
I think this topic had strayed from Win32-GUI to just Perl in general, so I'm sending my further responses just to Tim. If anyone wants the code, feel free to email me. _________________________________________________________________ Get your FREE download of MSN Explorer at http://explorer.msn.com |