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.
  1. 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.
  2. In the Command window, issue the following command:
  3. Call the ShellDoc procedure with the following syntax:
    DO ShellDoc WITH <cFilename>
    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.

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