Monday, November 08, 2010 at 12:02 AM.
system.verbs.builtins.file.findApplication
on findApplication (creator) {
<<Changes:
<<05/11/01; 6:54:10 PM by JES
<<If the kernel call fails on Windows, try to find the application by examining the registry directly (if the winRegistry verb is present).
on kernelCall (creator) {
kernel (file.findApplication)};
if system.environment.isMac {
return (kernelCall (creator))}
else { //Windows
local (appPath = "");
try { //this will fail for extensions longer than 4 chars
appPath = kernelCall (creator)};
if not defined (winRegistry.read) {
return (appPath)};
if appPath == "" { //look in the registry
local (fileType = winRegistry.read ("HKCR\\." + creator));
if not fileType { //winRegistry.read returns false if there's no key at the specified path
return (appPath)};
local (systemPath = file.folderFromPath (file.getSystemFolderPath ()));
systemPath = string.popTrailing (systemPath, "\\");
local (command = winRegistry.read ("HKCR\\" + fileType + "\\shell\\open\\command\\"));
command = string.trimWhiteSpace (command);
if command beginsWith "\"" {
appPath = string.nthField (command, "\"", 2)}
else { //parse the command
local (ch, ix = 0, ct = sizeOf (command));
loop {
if ++ix == ct {
break};
ch = command[ix];
if ch == " " {
case command[ix+1] {
"%";
"\"";
"/" {
appPath = string.mid (command, 1, ix);
break}}}};
appPath = string.replace (appPath, "%SystemRoot%", systemPath)}};
return (appPath)}};
bundle { //test code
findApplication ("htm")}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.