|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic
Internet Routines CreateProcess: Start Separate Instances of the Default Browser |
||
Posted: | Monday October 18, 1999 | |
Updated: | Monday December 26, 2011 | |
Applies to: | VB4-32, VB5, VB6 | |
Developed with: | VB6, Windows NT4 | |
OS restrictions: | None | |
Author: | VBnet - Randy Birch | |
Related: |
FindExecutable: Obtain Exe of the Default Browser FindExecutable: Find Exe Associated with a Registered Extension RegSetValueEx: Create a Registered File Association ShellExecute: Simulate a Hyperlink with a Label Control ShellExecute: ShellExecute Madness ShellExecute: Send Large Emails in Outlook Express |
|
Prerequisites | ||||||||
None. | ||||||||
|
||||||||
While ShellExecute will reliably display a specified URL
in the default browser, whether or not the call to ShellExecute will reuse an existing browser session or open a new session is always
unknown to the developer. The code presented here uses the FindExecutable method detailed in FindExecutable: Obtain Exe of the Default Browser, and the
CreateProcess API to force a new instance of the browser to be created for every call to the start routine.. Note however that this code can not guarantee the associated application returned is a browser, only that *some* application is associated with the specified extension. While in most cases this will be the default browser, it is possible that another browser or application has hijacked the html extension. One reported case indicated MS Word was associated with the html file extension. Therefore it may be justified to check the returned string from this call for "iexplore.exe" or the name of the browser of your choice, and if not the expected value to prompt the user to select their default browser, which you'd then save as your own setting for future reference. Another alternative would be to present the user with the list of installed browsers contained under the registry key: HKEY_LOCAL_MACHINE\SOFTWARE\Clients\StartMenuInternet ... or to retrieve the application related to the http:// command listed under: HKEY_LOCAL_MACHINE\SOFTWARE\Classes\http\shell\open\command
|
||||||||
BAS Module Code | ||||||||
None. | ||||||||
|
||||||||
Form Code | ||||||||
Drop a command button onto a form and add the following: | ||||||||
|
||||||||
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Const CREATE_NEW_CONSOLE As Long = &H10 Private Const NORMAL_PRIORITY_CLASS As Long = &H20 Private Const INFINITE As Long = -1 Private Const STARTF_USESHOWWINDOW As Long = &H1 Private Const SW_SHOWNORMAL As Long = 1 Private Const MAX_PATH As Long = 260 Private Const ERROR_FILE_NO_ASSOCIATION As Long = 31 Private Const ERROR_FILE_NOT_FOUND As Long = 2 Private Const ERROR_PATH_NOT_FOUND As Long = 3 Private Const ERROR_FILE_SUCCESS As Long = 32 'my constant Private Const ERROR_BAD_FORMAT As Long = 11 Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessId As Long dwThreadID As Long End Type Private Declare Function CreateProcess Lib "kernel32" _ Alias "CreateProcessA" _ (ByVal lpAppName As String, _ ByVal lpCommandLine As String, _ ByVal lpProcessAttributes As Long, _ ByVal lpThreadAttributes As Long, _ ByVal bInheritHandles As Long, _ ByVal dwCreationFlags As Long, _ ByVal lpEnvironment As Long, _ ByVal lpCurrentDirectory As Long, _ lpStartupInfo As STARTUPINFO, _ lpProcessInformation As PROCESS_INFORMATION) As Long Private Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long Private Declare Function FindExecutable Lib "shell32" _ Alias "FindExecutableA" _ (ByVal lpFile As String, _ ByVal lpDirectory As String, _ ByVal sResult As String) As Long Private Declare Function GetTempPath Lib "kernel32" _ Alias "GetTempPathA" _ (ByVal nSize As Long, _ ByVal lpBuffer As String) As Long Private Sub Command1_Click() Dim sURL As String 'the URL to open, of course! sURL = "http://vbnet.mvps.org/" 'if the call returns false, display a message If Not StartNewBrowser(sURL) Then MsgBox "No dice!" End If End Sub Private Function StartNewBrowser(sURL As String) As Boolean 'start a new instance of the user's browser 'at the page passed as sURL Dim success As Long Dim hProcess As Long Dim sBrowser As String Dim start As STARTUPINFO Dim proc As PROCESS_INFORMATION Dim sCmdLine As String sBrowser = GetBrowserName(success) 'did sBrowser get correctly filled? If success >= ERROR_FILE_SUCCESS Then sCmdLine = BuildCommandLine(sBrowser) 'prepare STARTUPINFO members With start .cb = Len(start) .dwFlags = STARTF_USESHOWWINDOW .wShowWindow = SW_SHOWNORMAL End With 'start a new instance of the default 'browser at the specified URL. The 'lpCommandLine member (second parameter) 'requires a leading space or the call 'will fail to open the specified page. success = CreateProcess(sBrowser, _ sCmdLine & sURL, _ 0&, 0&, 0&, _ NORMAL_PRIORITY_CLASS, _ 0&, 0&, start, proc) 'if the process handle is valid, return success StartNewBrowser = proc.hProcess <> 0 'don't need the process 'handle anymore, so close it Call CloseHandle(proc.hProcess) 'and close the handle to the thread created Call CloseHandle(proc.hThread) End If End Function Private Function GetBrowserName(dwFlagReturned As Long) As String 'find the full path and name of the user's 'associated browser Dim hFile As Long Dim sResult As String Dim sTempFolder As String 'get the user's temp folder sTempFolder = GetTempDir() 'create a dummy html file in the temp dir hFile = FreeFile Open sTempFolder & "dummy.html" For Output As #hFile Close #hFile 'get the file path & name associated with the file sResult = Space$(MAX_PATH) dwFlagReturned = FindExecutable("dummy.html", sTempFolder, sResult) 'clean up Kill sTempFolder & "dummy.html" 'return result GetBrowserName = TrimNull(sResult) End Function Private Function BuildCommandLine(ByVal sBrowser As String) As String 'just in case the returned string is mixed case sBrowser = lcase$(sBrowser) 'try for internet explorer If InStr(sBrowser, "iexplore.exe") > 0 Then BuildCommandLine = " -nohome " 'try for netscape 4.x ElseIf InStr(sBrowser, "netscape.exe") > 0 Then BuildCommandLine = " " 'try for netscape 7.x ElseIf InStr(sBrowser, "netscp.exe") > 0 Then BuildCommandLine = " -url " Else 'not one of the usual browsers, so 'either determine the appropriate 'command line required through testing 'and adding to ElseIf conditions above, 'or just return a default 'empty' 'command line consisting of a space '(to separate the exe and command line 'when CreateProcess assembles the string) BuildCommandLine = " " End If End Function Private Function TrimNull(item As String) 'remove string before the terminating null(s) Dim pos As Integer pos = InStr(item, Chr$(0)) If pos Then TrimNull = Left$(item, pos - 1) Else TrimNull = item End If End Function Public Function GetTempDir() As String 'retrieve the user's system temp folder Dim tmp As String tmp = Space$(MAX_PATH) Call GetTempPath(Len(tmp), tmp) GetTempDir = TrimNull(tmp) End Function |
||||||||
Comments | ||||||||
See FindExecutable: Obtain Exe of the Default Browser if you need to trap the error messages returned from the FindExecutable call. | ||||||||
|
|
|
|||||
|
|||||
|
|||||
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |