Help and Support
 

powered byLive Search

PRB: ShellExecuteEx Limits URL to MAX_PATH

Article ID:263909
Last Review:July 11, 2005
Revision:1.2
This article was previously published under Q263909

SYMPTOMS

When you use the ShellExecute or ShellExecuteEx function on version 4.0 of the Shell32.dll file to open a URL, the URL is limited to (MAX_PATH - 1) characters. A URL should be able to be as long as (INTERNET_MAX_URL_LENGTH - 1) (defined in Wininet.h) characters.

Back to the top

CAUSE

ShellExecute and ShellExecuteEx copy the file string into an internal buffer. In the original version of Shell32.dll, the buffer's maximum size is MAX_PATH characters. Starting with Shell32.dll version 4.71, this internal buffer is expanded to INTERNET_MAX_URL_LENGTH characters.

Back to the top

RESOLUTION

This problem can be overcome by creating a temporary Internet shortcut file that contains the long URL and passing the Internet shortcut file to ShellExecute or ShellExecuteEx. After calling ShellExecute or ShellExecuteEx, this file can safely be deleted.

Code such as the following can be used to create an Internet shortcut file:
#include <windows.h>
#include <shlobj.h>
#include <intshcut.h>

/**************************************************************************

   CreateInternetShortcut()

   pszShortcut - Path and file name of the Internet shortcut file. This 
   must have the URL extension for the shortcut to be used correctly.

   pszURL - URL to be stored in the Internet shortcut file.
   
**************************************************************************/ 

HRESULT CreateInternetShortcut(LPTSTR pszShortcut, LPTSTR pszURL)
{
IUniformResourceLocator *purl;
HRESULT                 hr; 

hr = CoInitialize(NULL);

if(SUCCEEDED(hr)) 
   { 
   //Get a pointer to the IShellLink interface. 
   hr = CoCreateInstance(  CLSID_InternetShortcut, 
                           NULL, 
                           CLSCTX_INPROC_SERVER, 
                           IID_IUniformResourceLocator, 
                           (LPVOID*)&purl); 
   
   if(SUCCEEDED(hr)) 
      { 
      IPersistFile* ppf;

      hr = purl->QueryInterface(IID_IPersistFile, (LPVOID*)&ppf);

      if(SUCCEEDED(hr)) 
         {
         hr = purl->SetURL(pszURL, 0);

         if(SUCCEEDED(hr))
            {
            WCHAR wszShortcut[MAX_PATH];

#ifdef UNICODE
            lstrcpyn(wszShortcut, pszShortcut, MAX_PATH);
#else
            MultiByteToWideChar( CP_ACP, 
                                 0, 
                                 pszShortcut, 
                                 -1, 
                                 wszShortcut, 
                                 MAX_PATH); 
#endif

            hr = ppf->Save(wszShortcut, FALSE);
            }
           
         ppf->Release(); 
         }
       
       purl->Release(); 
       }

   CoUninitialize();
   }

return hr;
}


				

Back to the top

STATUS

This behavior has been corrected in version 4.71 and later of Shell32.dll.

Back to the top


APPLIES TO
Microsoft Platform Software Development Kit-January 2000 Edition, when used with:
  Microsoft Windows 95
  Microsoft Windows NT Server 4.0 Standard Edition
  Microsoft Windows NT Workstation 4.0 Developer Edition

Back to the top

Keywords: 
kbshellgrp kbprb KB263909

Back to the top

Article Translations

 

Other Support Options

  • Need More Help?
    Contact a Support professional by Email, Online or Phone.
  • Customer Service
    For non-technical assistance with product purchases, subscriptions, online services, events, training courses, corporate sales, piracy issues, and more.
  • Newsgroups
    Pose a question to other users. Discussion groups and Forums about specific Microsoft products, technologies, and services.