Microsoft KB Archive/192352

= How To Invoke the "Open With..." Dialog Box Using _shellexecute =

Article ID: 192352

Article Last Modified on 7/1/2004

-

APPLIES TO


 * Microsoft Visual FoxPro 3.0 Standard Edition
 * Microsoft Visual FoxPro 3.0b Standard Edition
 * Microsoft Visual FoxPro 5.0 Standard Edition
 * Microsoft Visual FoxPro 5.0a
 * Microsoft Visual FoxPro 6.0 Professional Edition

-



This article was previously published under Q192352



SUMMARY
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.



MORE INFORMATION
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.dll DECLARE 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 liShowCmd

lsOperation = "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) ENDIF ENDPROC *-- Code ends here.

 In the Command window, issue the following command:

SET PROCEDURE TO ShellDoc

 Call the ShellDoc procedure with the following syntax:

DO ShellDoc WITH 

You may need to pass a path with the file name if the file is on a mapped drive. If  has no association, the "Open With..." dialog box appears.

