Opening a file in a specified application
by J.G.Harston, February 2008
You can open a file in an application, equivalent to double-clicking on it in a filer window, by using ShellExecute, as follows:
SYS "ShellExecute", @hwnd%, 0, file$, 0, 0, 1
This loads the file into the application that is associated with the file by reference to its file extension. For instance, a file with a “.doc” extension will be loaded into whatever application is associated with the “.doc” extension.
There may be times when you want to load a file into a specific application regardless of extension. For instance, you may want to load a batch file into a text editor. The simplest solution is to do:
SYS "ShellExecute", @hwnd%, 0, "notepad", file$, 0, 1
or
OSCLI "notepad "+file$
There are several problems with this.
Firstly, a minor one, you are depending on an application called 'notepad' existing on the computer the program is run on.
Secondly, and much more importantly, you must never force a user to use your choice of application, you must use the user's choice. Many people regard notepad as a very bad text editor and use something else.
The user's configured applications are named in the registry and referenced by the file extension they respond to. You can load a file to the user's text editor using the following code:
INPUT "File: "file$ root$=FNRegistry_RdStr(&80000000,".txt",""):REM HKEY_CLASSES_ROOT IF root$="" THEN ERROR 100, "No file association" command$=FNRegistry_RdStr(&80000000, root$+"\shell\open\command","") IF command$="" THEN ERROR 100, "No open command" A%=INSTR(command$,"%1"):IF A% THEN command$=LEFT$(command$,A%-1)+MID$(command$,A%+2) A%=INSTR(command$,""""""):IF A% THEN command$=LEFT$(command$,A%-1)+MID$(command$,A%+2) command$=FNExpandEnvironmentStrings(command$) SYS "ShellExecute", @hwnd%, 0, command$, file$, 0, 1 END
Here we read the default application which opens text files (.txt) from the registry and use “ShellExecute” to open the requested file in the chosen application. Effectively, this bypasses the automatic file association and executes the file as though it had a “.txt” extension.
The “.txt” extension in the code above can be changed to any other extension. For instance to open a HTML document or URL in the user's choice of web browser, and not force them to use Internet Explorer you would change the relevant line above to:
root$=FNRegistry_RdStr(&80000000,".htm",""):REM HKEY_CLASSES_ROOT
The above code uses the following code from the Registry library and a routine called FNExpandEnvironmentStrings:
DEF FNRegistry_RdInt(hk%,Key$,Item$):LOCAL Want%:Want%=4 DEF FNRegistry_RdBig(hk%,Key$,Item$):LOCAL Want%:Want%=4 DEF FNRegistry_RdStr(hk%,Key$,Item$):LOCAL Want%:Want%=1 DEF FNRegistry_Rd( hk%,Key$,Item$):LOCAL Want%:Want%=1 LOCAL K%,R%,L%,T%,S$,Buf% SYS "RegOpenKeyEx",hk%,Key$,0,&20001,^K% TO R% IF R%=0 THEN SYS "RegQueryValueEx",K%,Item$,0,^T%,0,^L%:DIM Buf% LOCAL L% SYS "RegQueryValueEx",K%,Item$,0,^T%,Buf%,^L% TO R% SYS "RegCloseKey",K% ENDIF IF Want%=4 :IF R%=0:=0 IF Want%=4 :=!Buf% IF R%:="" IF T%=1:Buf%?(L%-1)=0:=$$Buf% K%=Buf%:WHILE L%:S$+=CHR$?K%:K%+=1:L%-=1:ENDWHILE =S$ DEF FNExpandEnvironmentStrings(S$) LOCAL B%:DIM B% LOCAL 255 SYS "ExpandEnvironmentStrings", S$, B%, 256 =$$B%