Microsoft KB Archive/148806

= BUG: You receive a "Cannot find the file " error message in Windows 95 or in Windows 98 when you open a document and the associated executable is an MFC application that has a long file name =

Article ID: 148806

Article Last Modified on 11/21/2006

-

APPLIES TO

 Microsoft Foundation Class Library 4.2, when used with:  Microsoft Visual C++ 4.0 Standard Edition

 Microsoft Visual C++ 4.1 Subscription

 Microsoft Visual C++ 4.2 Professional Edition

 Microsoft Visual C++ 5.0 Standard Edition</li></ul>

 Microsoft Visual C++ 6.0 Service Pack 5</li></ul> </li></ul>

-

<div class="notice_section">

This article was previously published under Q148806

<div class="symptoms_section">

SYMPTOMS
When you try to open a document whose extension is associated with an MFC application that has a long file name on Windows 95 or Windows 98, a dialog box with an error message similar to the following appears:

Cannot find the file 'filename' (or one of its components). Make sure the path and filename are correct and that all required libraries are available.

Closing the message box won't bring up the application's windows, but will leave the executable file open.

On Windows Millennium Edition (Me), the error message is:

Windows cannot find ' '. You may have typed the name incorrectly in the Run dialog, or another open program cannot find a system file. To search for a file, click the Start button, and then click Search.

<div class="cause_section">

CAUSE
The MFC function CWinApp::RegisterShellFileTypes writes the application's 8.3 file name to the registry. However, CWinApp::EnableShellOpen calls ::GlobalAddAtom with the application's long file name. Windows 95 and Windows 98 cannot handle this situation.

<div class="resolution_section">

RESOLUTION
Override CWinApp::EnableShellOpen using the sample code below to pass the application's short file name to ::GlobalAddAtom.

<div class="status_section">

STATUS
Microsoft has confirmed that this is a bug in the Microsoft products that are listed in the "Applies to" section.

This problem was corrected in Microsoft Visual C++ .NET.

<div class="moreinformation_section">

Steps to reproduce the problem on a computer that is running Windows 95 or Windows 98

 * 1) Select a new MFC AppWizard(exe) project to create an MDI application with a long project name.
 * 2) At step 3 of the AppWizard select Automation Support.
 * 3) Then at step 4 of the AppWizard, choose Advanced and specify a 3 letter file extension.
 * 4) Build the application and run it once so the file type is registered by the call to RegisterShellFileTypes in InitInstance.
 * 5) Save a file with the selected file extension and double-click to open it from the Windows Explorer.

This can be worked around by overriding CWinApp::EnableShellOpen and registering the application name atom using the short filename. Following is a sample of what the code should look like: /* Compile options needed: Default MFC applications.

void CLongFileNameApp::EnableShellOpen {  ASSERT(m_atomApp == NULL && m_atomSystemTopic == NULL); // do once

CString strShortName; TCHAR szLongPathName[_MAX_PATH]; ::GetModuleFileName(m_hInstance, szLongPathName, _MAX_PATH); if (::GetShortPathName(szLongPathName, strShortName.GetBuffer(_MAX_PATH), _MAX_PATH) == 0) {     // Rare failure case (especially on not-so-modern file systems) strShortName = szLongPathName; }  strShortName.ReleaseBuffer; int nPos = strShortName.ReverseFind('\\'); if (nPos != -1) strShortName = strShortName.Right(strShortName.GetLength- nPos-1); nPos = strShortName.ReverseFind('.'); if (nPos != -1) strShortName = strShortName.Left(nPos); m_atomApp = ::GlobalAddAtom(strShortName); m_atomSystemTopic = ::GlobalAddAtom(_T("system"));

}

Additional query words: 8.3 filename EnableShellOpen

Keywords: kbbug kbcode kbfix kbnoupdate KB148806

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.