When launching a data file with the ShellExecute() function, Windows tries to find the associated application and open the data file with this application. But what happens if no association exists? ShellExecute() simply returns error code 31 (no association) and nothing happens. Wouldn’t it be nice if your program invoked the “Open with …” dialog box so you can choose which application you want to associate with your data file? Here’s a solution-call the ShellDoc routine and pass a fully qualified path/file name of the data file you wish to open:
Option ExplicitDeclare Function GetDesktopWindow Lib "user32" () As LongDeclare Function ShellExecute Lib _ "shell32.dll" Alias "ShellExecuteA" _ (ByVal hWnd As Long, ByVal lpOperation _ As String, ByVal lpFile As String, _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As LongDeclare Function GetSystemDirectory Lib _ "kernel32" Alias "GetSystemDirectoryA" _ (ByVal lpBuffer As String, ByVal nSize _ As Long) As LongPrivate Const SE_ERR_NOASSOC = 31Public Sub ShellDoc(strFile As String) Dim lngRet As Long Dim strDir As String lngRet = ShellExecute(GetDesktopWindow, _ "open", strFile, _ vbNullString, vbNullString, vbNormalFocus) If lngRet = SE_ERR_NOASSOC Then ' no association exists strDir = Space(260) lngRet = GetSystemDirectory(strDir, _ Len(strDir)) strDir = Left(strDir, lngRet) ' show the Open with dialog box Call ShellExecute(GetDesktopWindow, _ vbNullString, "RUNDLL32.EXE", _ "shell32.dll,OpenAs_RunDLL " & _ strFile, strDir, vbNormalFocus) End IfEnd Sub