* This is in my D: drive * d:\vfpcommonclasses\shexec.prg #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 Class ShellExecutor As Custom cError = '' cErrors = '' Procedure Init Declare Long ShellExecute In "shell32.dll" ; long HWnd, String lpszOp, ; string lpszFile, String lpszParams, ; string lpszDir, Long nShowCmd TEXT to this.cErrors noshow 0,The operating system is out of memory or resources. \n 2,The specified file was not found. \n 3,The specified path was not found. \n 11,The .exe file is invalid (non-Win32® .exe or error in .exe image). \n 5,The operating system denied access to the specified file. \n 27,The file name association is incomplete or invalid. \n 30,The DDE transaction could not be completed because other DDE transactions were being processed. \n 29,The DDE transaction failed. \n 28,The DDE transaction could not be completed because the request timed out. \n 32,The specified dynamic-link library was not found. \n 31,There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable. \n 8,There was not enough memory to complete the operation. \n 26,A sharing violation occurred. \n ENDTEXT Endproc Procedure Execute Lparameters tcExecutable,tcParams,tcWorkingDir,tnShowType,tcOperation *!* ShExecute('c:\temp\nodoc.doc') *!* ShExecute('c:\temp\nodoc.xyz') *!* ShExecute('d:\fpd26\foxprox.exe','mytest.prg','d:\fpd26',0) *!* ShExecute('d:\fpd26\foxprox.exe',,'d:\fpd26') tcOperation = Iif(Empty(m.tcOperation), 'Open', m.tcOperation) tcExecutable = Iif(Empty(m.tcExecutable), '', m.tcExecutable) tcParams = Iif(Empty(m.tcParams), '', m.tcParams) tcWorkingDir = Iif(Empty(m.tcWorkingDir), '', m.tcWorkingDir) tnShowType = Iif(Type('m.tnShowType') # 'N', SW_SHOWNORMAL, m.tnShowType) Local lnResult lnResult = ShellExecute(0,m.tcOperation,m.tcExecutable,m.tcParams,m.tcWorkingDir,m.tnShowType) If ( m.lnResult <= 32 ) This.cError = This.GetErrorMsg(m.lnResult) Else This.cError = '' Endif Return ( m.lnResult > 32 ) && No Error Endproc Procedure GetErrorMsg Lparameters tnErrNum Local Array aErrors[1] Local lcMessage, ix For ix=1 To Alines(aErrors,This.cErrors,.T.,'\n') If ( Val(Chrtran(Left(aErrors[m.ix],; At(',',aErrors[m.ix])-1),Chr(13)+Chr(10),'')) = m.tnErrNum ) lcMessage = Substr(aErrors[m.ix],At(',',aErrors[m.ix])+1) Exit Endif Endfor If Empty(m.lcMessage) lcMessage = 'An unspecified error occurred.' Endif Return m.lcMessage Endproc EnddefineAnd this is a sample call:
Local lcFile lcFile = 'C:\Program Files (x86)\LINQPad5\LinqPad.exe' Local oShellExec As 'ShellExecutor' Of 'd:\vfpcommonclasses\shexec.prg' oShellExec = Newobject('ShellExecutor','d:\vfpcommonclasses\shexec.prg') If !oShellExec.Execute(m.lcFile,'','',1) Messagebox( oShellExec.cERROR,0,'An error occurred') Endif