Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Open a URL in a new window

0.00/5 (No votes)
10 Jul 2003 1  
An article showing how to launch a URL in a new browser window

Introduction

Ever wanted to open a URL without blatting the contents of an existing browser window?  Here's how - and it will only take you seconds.

First, include the header file:

 #include "url.h"

Then simply declare a CURL object and call the Open method:

CURL url;
url.Open(_T("http://www.codeproject.com/">http://www.codeproject.com/"));

If you want to re-use an existing browser window, then pass false as the second parameter:

CURL url;
url.Open(_T("http://www.codeproject.com/">http://www.codeproject.com/"), false);

That's it!  Easy - and you can use this code with any CString friendly framework (MFC, WTL, ATL7).

CURL

#pragma once

class CURL
{
private:
 // The default browser

 CString m_strBrowser;
public:
 // Open a URL

 void Open(LPCTSTR lpszURL, bool bNewWindow = true)
 {
  if (bNewWindow)
   ::ShellExecute(NULL, NULL, GetBrowser(), lpszURL, NULL, SW_SHOWNORMAL);
  else
   ::ShellExecute(NULL, NULL, lpszURL, NULL, NULL, SW_SHOWNORMAL);
 }

 // Get the default browser from the registry

 LPCTSTR GetBrowser(void)
 {
  // Have we already got the browser?

  if (m_strBrowser.IsEmpty())
  {
   // Get the default browser from HKCR\http\shell\open\command

   HKEY hKey = NULL;
   // Open the registry

   if (::RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("http\\shell\\open\\command"),
     0, KEY_READ, &hKey) == ERROR_SUCCESS)
   {
    // Data size

    DWORD cbData = 0;
    // Get the default value

    if (::RegQueryValueEx(hKey, NULL, NULL, NULL, NULL, &cbData) 
        == ERROR_SUCCESS && cbData > 0)
    {
     // Allocate a suitable buffer

     TCHAR* psz = new TCHAR [cbData];
     // Success?

     if (psz != NULL)
     {
      if (::RegQueryValueEx(hKey, NULL, NULL,
       NULL, (LPBYTE)psz, &cbData) ==
       ERROR_SUCCESS)
      {
       // Success!

       m_strBrowser = psz;
      }
      delete [] psz;
     }
    }
    ::RegCloseKey(hKey);
   }
   // Do we have the browser?

   if (m_strBrowser.GetLength() > 0)
   {
    // Strip the full path from the string

    int nStart = m_strBrowser.Find('"');
    int nEnd = m_strBrowser.ReverseFind('"');
    // Do we have either quote?

    // If so, then the path contains spaces

    if (nStart >= 0 && nEnd >= 0)
    {
     // Are they the same?

     if (nStart != nEnd)
     {   
      // Get the full path

      m_strBrowser = m_strBrowser.Mid(nStart + 1, nEnd - nStart - 1);
     }
    }
    else
    {
     // We may have a pathname with spaces but

     // no quotes (Netscape), e.g.:

     //   C:\PROGRAM FILES\NETSCAPE\COMMUNICATOR\PROGRAM\NETSCAPE.EXE -h "%1"

     // Look for the last backslash

     int nIndex = m_strBrowser.ReverseFind('\\');
     // Success?

     if (nIndex > 0)
     {
      // Look for the next space after the final

      // backslash

      int nSpace = m_strBrowser.Find(' ', nIndex);
      // Do we have a space?

      if (nSpace > 0)
       m_strBrowser = m_strBrowser.Left(nSpace);    
     }
    }
   }
  }
  // Done

  return m_strBrowser;
 }
};

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here