Option Explicit
Declare Function GetDesktopWindow Lib "user32" () As Long Declare 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 Long Declare Function GetSystemDirectory Lib _ "kernel32" Alias "GetSystemDirectoryA" _ (ByVal lpBuffer As String, ByVal nSize _ As Long) As Long Private Const SE_ERR_NOASSOC = 31 Public 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 If End Sub --------------------------------------------------------------------------------------------------------- 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: |