How To Invoke the "Open With..." Dialog Box Using _shellexecute
This article was previously published under Q192352
This article has been archived. It is offered "as is" and will no longer be updated.
The FoxPro Foundation Class _shellexecute can be used to run external programs, as well as open non-executable files if there is a program associated with that file. However, if there is no program associated with the file, _shellexecute returns SE_ERR_NOASSOC (31) and no action is taken upon the file. This article demonstrates how to create a procedure that uses the "Open With..." dialog box to give the user the option of selecting a program with which to open the file.
The process must be either executed from a program function or a class will have to be created from scratch. The following code describes how to do this as a program function.
- Save the following code to a program file and save it as ShellDoc.prg:
*-- Code begins here.PROCEDURE ShellDoc()LPARAMETERS lsFile*-- Defines from Winuser.h*-- These constants will be used with the*-- ShellExecute function.#define SW_HIDE 0#define SW_SHOWNORMAL 1#define SW_NORMAL 1#define SW_SHOWMINIMIZED 2#define SW_SHOWMAXIMIZED 3#define SW_MAXIMIZE 3#define SW_SHOWNOACTIVATE 4#define SW_SHOW 5#define SW_MINIMIZE 6#define SW_SHOWMINNOACTIVE 7#define SW_SHOWNA 8#define SW_RESTORE 9#define SW_SHOWDEFAULT 10#define SW_FORCEMINIMIZE 11#define SW_MAX 11#define SE_ERR_NOASSOC 31*-- GetDesktopWindow gives us a window handle to*-- pass to ShellExecute.DECLARE INTEGER GetDesktopWindow IN user32.dllDECLARE INTEGER GetSystemDirectory IN kernel32.dll ; STRING @lsBuffer, ; INTEGER liSize*-- ShellExecute is of the following format:*-- HINSTANCE ShellExecute(*-- HWND hwnd,*-- LPCTSTR lpOperation,*-- LPCTSTR lpFile,*-- LPCTSTR lpParameters,*-- LPCTSTR lpDirectory,*-- INT nShowCmd*-- );DECLARE INTEGER ShellExecute IN shell32.dll ;INTEGER, ;STRING @lsOperation, ;STRING @lsFile, ;STRING @lsParameters, ;STRING @lsDirectory, ;INTEGER liShowCmdlsOperation = "open"liRet = ShellExecute(GetDesktopWindow(), @lsOperation, @lsFile, ; "", "", SW_SHOWNORMAL)IF liRet = SE_ERR_NOASSOC && No association exists lsSysDir = SPACE(260) && MAX_PATH, the maximum path length*-- Get the system directory so that we know*-- where Rundll32.exe resides.liRet = GetSystemDirectory(@lsSysDir, LEN(lsSysDir))lsSysDir = SUBSTR(lsSysDir, 1, liRet)lsRun = "RUNDLL32.EXE"lsParameters = "shell32.dll,OpenAs_RunDLL "liRet = ShellExecute(GetDesktopWindow(), "open", lsRun,;lsParameters + lsFile, lsSysDir, SW_SHOWNORMAL)ENDIFENDPROC*-- Code ends here.
- In the Command window, issue the following command:
SET PROCEDURE TO ShellDoc
- Call the ShellDoc procedure with the following syntax:You may need to pass a path with the file name if the file is on a mapped drive. If <cFilename> has no association, the "Open With..." dialog box appears.
DO ShellDoc WITH <cFilename>
Article ID: 192352 - Last Review: 02/23/2014 01:10:47 - Revision: 3.0
Microsoft Visual FoxPro 3.0 Standard Edition, Microsoft Visual FoxPro 5.0 Standard Edition, Microsoft Visual FoxPro 6.0 Professional Edition, Microsoft Visual FoxPro 7.0 Professional Edition, Microsoft Visual FoxPro 8.0 Professional Edition, Microsoft Visual FoxPro 9.0 Professional Edition
- kbnosurvey kbarchive kbapi kbffc kbhowto KB192352