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

Article translations Article translations
Article ID: 192352 - View products that this article applies to.
This article was previously published under Q192352
This article has been archived. It is offered "as is" and will no longer be updated.
Expand all | Collapse all

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.
  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.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.
  2. In the Command window, issue the following command:
    SET PROCEDURE TO ShellDoc
  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.

Properties

Article ID: 192352 - Last Review: February 23, 2014 - Revision: 3.0
APPLIES TO
  • 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
Keywords: 
kbnosurvey kbarchive kbapi kbffc kbhowto KB192352

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com