This Readme file contains updated information for the entire Microsoft Visual Studio suite of developer tools. If you downloaded a Core service pack from the Internet, not all sections of this file apply to the updates you received. The fixed issues appropriate for the Core downloads are those listed in the Visual Studio section plus the sections for the products updated by your Core download.
The Microsoft Visual Studio 6.0 Service Pack 3 Readme contains the following sections:
PART 1: Overview and Installation
PART 2: Visual Studio
PART 3: Visual Basic
PART 4: Visual C++
PART 5: Visual FoxPro
PART 6: Visual InterDev
PART 7: Visual J++
PART 8: Visual SourceSafe
PART 9: File Versions
For the latest product information, see the Visual Studio Web site at:http://msdn.microsoft.com/vstudio
For the latest product updates, see the Visual Studio Support Highlights site at:http://support.microsoft.com/support/vstudio
Please see the REFERENCES section below for more information about the other parts of this readme.
Microsoft Visual C++
The following is a summary of Visual C++ issues fixed with Service Pack 3, arranged according to issue category and service pack, and a list of known issues. See the listed Knowledge Base articles for more details.
Windows CE ToolKit and Visual Studio 6.0 Service Pack 3
Visual Studio Service Pack 3 overwrites certain Visual C++ 6.0 components that are modified when you install the Microsoft Windows CE Toolkit for Visual C++ 6.0. This means you cannot run the Windows CE Toolkit for Visual C++ 6.0 with Service Pack 3 installed on your machine. Note also that Service Pack 3 does not include an uninstaller. If you install Service Pack 3 and then want to run the Windows CE Toolkit for Visual C++, you must remove Visual C++ 6.0 using the Visual C++ 6.0 uninstaller and then reinstall Visual C++ 6.0 and the Windows CE Toolkit for Visual C++. Future versions of the Windows CE Toolkit for Visual C++ will address this incompatibility with Visual Studio 6.0 Service Pack 3.
Installing Service Pack 3 on Windows 2000 Beta 3
For information about installing Visual Studio 6.0 Service Pack 3 on Windows 2000 Beta 3, see Installing Service Pack 3 on Windows 2000 later in this article.
The following ATL issues have been fixed:
Crashing when passing a NULL pointer to the (ATL-overridden) delete operator or free function.
CComVariant > and < operators cause LNK2001 errors.
Access violations when unregistering an ATL DLL or EXE built with a version of Visual C++ prior to 6.0 on a computer with the Visual C++ 6.0 Atl.dll installed.
Some ATL controls did not size properly.
- Registering an ATL server with a long pathname failed.
Descriptions weren't added to registry when using the DECLARE_REGISTRY() macro.
CComEnumImpl<>::Skip() didn't handle overflow correctly.
"'m_mov' : undeclared identifier" Error With Alpha Project
GetIDsOfNames( ) Returns DISP_E_UNKNOWNNAME For Named Args
The following build issues have been fixed:
An incorrect version of Cvtres.exe, used by the linker to convert resource files into COFF format, caused some multiple-language resources to be unavailable to the application.
A friend << operator would not compile if defined outside the class.
Project Deletes Precompiled Header Created by Other Project.
When compiling with /Og and /Oa or /Og and /Ow, code might be incorrectly optimized due to ignoring the scale on an indirection. For example:
was incorrectly optimized as follows:
mov esi,dword ptr [ecx+edx*4]
mov ecx,dword ptr [ecx+edx]
mov esi,dword ptr [ecx+edx*4]
mov ecx,esi // error, because we were actually trying
// to load from a different address.
A compiler limitation prevented compiling code with more than 58 pairs of nested parentheses. With SP3, the compiler now supports up to 256 levels of nesting.
The use of the ++ operator in a return statement produced access violations when code was compiled with /Od.
In some cases, compiling with /Og generated incorrect code causing the stack frame to be copied before the stack contents were completely set up.
When optimizing for speed, the compiler generated incorrect code for a bitwise OR operation on a Boolean type, causing the compiled application to crash, corrupt data, or otherwise misbehave.
The compiler generated erroneous initializations for const int variables that were initialized with floating-point values.
Bad code generation or an internal compiler error when all of these conditions apply:
- Both the left and right hand sides of the colon in a ternary (? :) operator are of class type.
- The right side is convertible to the left side by way of a user-defined conversion operator.
- The left side has no constructor that accepts an object of the class specified on the right side.
The compiler sometimes did not create the relocation fixup for the address of the function if you declared and initialized a variable from a typedef of a pointer-to-function using a typedef for the function definition.
In some cases, compiling with /Zi and /Yc produced a C1001 internal compiler error.
Using a function pointer as a template class argument and then calling that function, as shown in the following example, produced compiler errors:
template < class T, int (*pfn)(T *)>
int Test(T *pb)
int Bar( BOGUS *pb )
void main (void)
b.m_i = 6;
Foo < BOGUS, &Bar > foo;
Code failed to call the destructor of an explicitly constructed anonymous temporary.
When optimizing code with /Og and /G6, Visual C++ sometimes moved an inc, add, sub, or lea instruction across an instruction that references memory. In some cases, such as the following example, Visual C++ 6.0 did not properly update the displacement:
mov [eax + 2*eax + 3]
Projects continuing to use environment settings after removal of the /useenv option. The workaround required deleting a registry setting. With SP3, the IDE uses environment settings only when /useenv is set.
In rare cases, code compiled with /Og saved half of a double into memory and then loaded an FP register from it. Because half of the FP value was random data, an incorrect value resulted.
When building a VxD with /map, the linker lost the file handle to the map file, resulting in a linker tools error ("LNK1104: Cannot open file file.map").
The linker produced invalid images when building a VxD or driver with the /ZI (Edit and Continue) compiler option. /ZI injects special information into the image, which prevents a VxD or driver from loading. The linker has been changed to ignore the /ZI option when /VXD is specified. (This means you cannot use Edit and Continue when debugging a VxD or driver.) The linker also warns the user if it finds a section known to be invalid for a VxD.
The linker allowed the user to build an image with a specified stack or heap commit size larger than the specified reserve size. This invalid state prevented tools such as the debugger from loading the image. If you specify a stack or heap commit size larger than the reserve size, the linker now issues a fatal error message.
Bad code was generated when the result of an intrinsic was passed to a function that takes an int& argument.
#import ignored TKIND_MODULE members of a type library.
In some cases, compiling with /Og and /Ob1 generated an incorrect comparison when a loop induction variable was compared within the loop and the variable type in the comparison differed from the type in the rest of the loop.
In some cases, when using delay-load imports on the Alpha platform, the linker produced invalid fixups and silently produced a bad image.
- Visual C++ 6.0 did not support terminal-server aware applications. The SP3 release adds a new linker option, /tsaware[:no], for this purpose. The /tsaware option causes the linker to set the appropriate bit in the image optional header for a terminal-server aware application.
The following CRT issue has been fixed in Service Pack 3:
The following CRT issues have been fixed in previous service packs and are included in Service Pack 3.
Service Pack 1:
Service Pack 2:
- MSVCRT.DLL: In Service Pack 2, MSVCRT.DLL was modified to include the Visual C++ 5.0 heap in addition to the Visual C++ 6.0 heap for better compatibility. Visual C++ 6.0 applications will continue to use the Visual C++ 6.0 heap and pre-Visual C++ 6.0 applications will use the Visual C++ 5.0 heap.
The heap-compatibility problems described in the following two Knowledge Base articles have been fixed:
Updated Data Access Objects (DAO)
An updated version of DAO 3.6 is included in Visual Studio 6.0 Service Pack 3. DAO 3.6 ships with Office 2000, and the files provided in this service pack make it possible for you to develop for the updated version. DAO 3.6 can be installed along with DAO 3.5x. The SDK source files noted later in this document are not redistributable.
Upgrading to DAO 3.6 is recommended only for existing DAO applications that need access to Office 2000 format databases. For new projects, it is highly recommended you use ActiveX Data Objects (ADO) which is the successor to DAO as the Microsoft preferred data access programming model (built on the new OLE DB technology).
Changes in DAO 3.6
- Support for Unicode was added.
- Support for Unicode was added.
Support for Jet 4.0 was added.
- RepairDatabase is no longer supported. This is to match Jet 4.0. If this functionality is needed, use CompactDatabase, which will also perform a repair.
DAO 3.6 files included with Visual Studio Service Pack 3
Included in this service pack are the following files:
To use or build projects with DAO from Visual C++, build the LIB files (see the following instructions). These files can be found on the Visual Studio Service Pack 3 CD in the \support directory or in your extraction folder if you downloaded the service pack from the Internet:
DAO SDK Headers DAO SDK Source
To Build the DAO Libraries
- Copy the DAO SDK Headers and Source files to a directory on a computer running Visual Studio.
- In Visual C++, open DBDAO.DSW.
- From the Build menu, choose Configurations, and select the type of library you want to use.
- From the Build menu, choose Build<dll name>. You can build multiple dlls at the same time by choosing Batch Build from the Build menu.
- Compile your DAO application as usual.
Distributing DAO 3.6
To distribute an application that accesses DAO 3.6 through the DAO SDK classes, install the appropriate DAO36x.DLL for your application.
The following debugger issues have been fixed:
Possible failure of an asynchronous break on a multiprocessor computer when the breakpoint has been encountered more than once.
The debugger would crash, hang, or emit low resource warnings when remotely debugging a program with frequent calls to OutputDebugString.
The debugger would crash if two symbols in the debug information had the same hash value.
Remote debugging did not work on the Alpha platform.
The following Integrated Development Environment (IDE) issues have been fixed:
IDE crashed when the running of a macro caused repeated exceptions.
IDE would freeze or exit when trying to display a DataTip popup on _asm or __asm.
When attempting to access the CreateObject or GetObject functions from the IDE, VBScript displayed the following error message:
Calls to these functions sometimes succeeded despite the error message.
Line #: ActiveX component can't create object
Redrawing of the ClassView pane was slow when using Visual SourceSafe.
IDE crashed when doing a Save As of a utility project.
IDE crashed when the user attempted to mark and delete a line while a function parameter DataTip was visible.
In some cases, the IDE exited without warning when the user created a derived class in the source editor.
IDE crashed when repeatedly executing the Documents.Open macro on a file that does not exist.
Calls to the Developer Studio object method AddConfiguration failed when AddConfiguration was used in a MakeFile project.
Microsoft Foundation Classes (MFC) Issues
Installing Service Pack 3 on Windows 2000 Beta 3
For information about installing Visual Studio 6.0 Service Pack 3 on Windows 2000 Beta 3, see Installing Service Pack 3 on Windows 2000.
Using Access 2000 Databases with MFC 6.0.
MFC 6.0 has the ability to use Microsoft Access 2000 databases. To engage this support in your application, you must enable DAO 3.6 by:
- Linking with the DLL version of MFC and adding the following line to InitInstance before you make any database-related calls:
- or -
AfxGetModuleState()->m_dwVersion = 0x0601
- Recompile the MFC static libs with _MFC_VER set to 0x0601.
The following MFC issues have been fixed:
MFC AppWizard associated incorrect images with toolbar buttons for SDI applications that did not use the document/view architecture.
The socket thread state was not initialized in multithreaded, statically linked MFC applications. If one of the threads in an application called AfxSocketInit, further calls to the same function from other threads failed to set the socket thread state for that thread.
Asserts occurred when creating a dialog box in an MFC regular DLL.
Calling CString::Format on a string bound to an MFC ODBC field containing a double sometimes caused the memory to be reallocated, making the binding inconsistent for parameters and output columns.
MFC AppWizard applications with no document/view architecture, initial status bar, or docking toolbar would crash on an assert statement.
CMenu::GetMenuString did not properly handle strings over 256 bytes, resulting in possible corruption.
A bug in CControlBar::WindowProc caused an access violation when TOOLTIPTEXT.lpszText was the ID for a string resource or was unused. This happened when the identifier of a string resource was copied to the lpszText structure member, and the handle of the instance containing the resource was copied to the hinst structure member.
CDaoDatabase::CreateRelation called Release beyond the reference count, causing an assertion.
MFC applications could experience problems due to the failure of COleDateTime::operator= to properly account for dates after the year 1999. This problem is fixed by changes to MFC40.DLL and MFC40u.DLL. MFC applications that use these DLLs can use the fix without being recompiled. Only applications built with Visual C++ 4.0 or 4.1 require this updated DLL.
Service Pack 1
The following MFC issues were fixed in Service Pack 1 and are included in Service Pack 3:
ActiveX controls that resize themselves in response to being moved would cause a stack overflow.
CDialog::Create did not return FALSE when dialog creation failed.
Inappropriate assertions were raised in debug builds in some Automation routing situations involving nested activations.
Deserializing an ANSI string in a UNICODE release build of MFC caused an access violation.
MFC DLLs created with Visual C++ 6.0 did not call CPrintDlg::OnInitDialog, causing programs that depended on this initialization routine to fail.
The following multilanguage and language coexistence issues have been fixed:
- A problem in Devshl.dll that prevented Microsoft® Visual Fortran users from doing command-line builds.
- Corruption of the string table causing inability to find strings for additional languages in a resource when an application calls from one programming language to another.
OLE DB Consumer Issues
The following OLE DB Consumer issues have been fixed:
When using CArrayRowset, storing more than one page (4 KB) of data in the buffer or trying to get a nonexistent record caused an infinite loop. With SP3, storing more than 4 KB of data works properly, and trying to get a nonexistent record causes an access violation (as intended) which the user can catch.
OLE DB Templates used DBFILETIME instead of FILETIME.
UUID.LIB contained a bad definition for the IViewFilter interface. IViewFilter is an OLE DB 1.5 interface that is not used by the OLE DB Templates. However, this definition could cause problems for OLE DB consumers trying to use the interface directly.
FIX: DB_E_ERRORSOCCURRED From Jet Provider During OpenDataSource.
OLE DB Provider Issues
The following OLE DB Provider issues have been fixed:
CTABLESRow did not have a TABLE_PROPID column. This has been added, so OLE DB Templates providers will not fail when a consumer requests this column.
The PROVIDER_COLUMN_ENTRY macro set the DBID.eKind value to zero (DBKIND_GUID_NAME) instead of 2 (DBKIND_NAME). This could cause problems when an OLE DB Templates provider is used with SQL Server 7.0.
IDBPropertiesImpl::GetPropertyInfo did not return the correct values when the cPropertyIDSets parameter was zero. This could result in undefined consumer behavior, including weird error messages, crashes, or lock ups.
IRowsetImpl::GetData returned a nonzero value for the Length even if the data was null. GetData now correctly returns zero for Length if the data is null.
The OLE DB Templates did not set the CATALOG and SCHEMA columns for all schema rowsets to null, as required for OLE DB providers that do not implement theIDBInfo interface.
A failure in InternalCreateSchemaRowset caused an access violation.
To better conform to the OLE DB specification, the names of columns in the CCOLUMNSRow Provider Column Map have changed by the addition of an underscore. For example, TableCatalog has become TABLE_CATALOG. This prevents OLE DB Templates providers from failing when a consumer requests one of these columns.
A consumer who queried for information about Initialization properties (information about userid, password, and so on) from the provider would receive incorrect information, leading to possible crashes or hanging.
Visual SourceSafe Integration Issues
The following Visual SourceSafe integration issue haS been fixed:
This section describes current issues for the Visual C++ 6.0 SP3 release. For issues that have been fixed, see the sections preceding this one.
OLE DB/ODBC Issues
- MFC EXE Appwizard fails to show the worksheets in an Excel spreadsheet when specifying an ODBC connection.
When specifying an Excel ODBC connection, the MFC EXE Appwizard shows an empty list and asks the user to select a table. To work around this issue, use an OLE DB Provider for ODBC drivers connection to the Excel spreadsheet instead.
- MFC EXE Appwizard generated application fails to open recordset on an Access table through the OLE DB provider for ODBC drivers.
When an MFC EXE Appwizard-generated application that connects to an Access table through the OLE DB provider for ODBC drivers is executed, it displays a "Recordset failed to open" message. There is no current workaround for this problem. It will be fixed in a future release of the Microsoft Data Access Components (MDAC).
- Microsoft OLE DB provider for SQL server fails to open a table without a primary key.
The Microsoft OLE DB provider for SQL server cannot open a table that does not have a primary key defined. To work around this issue, access the table using the Microsoft OLE DB provider for ODBC drivers and a SQL server ODBC driver.
Using MDAC 2.1 with Visual Studio SP3
Setup does not install the MDAC 2.1 library and header files. Visual Studio Service Pack 3 has been tested with the MDAC 2.0 headers and libraries against the MDAC 2.1 binaries. If you need to use specific MDAC 2.1 interfaces, you will need to install the headers and libraries manually. For information on installing the library and header files, see Installing Microsoft Data Access Components 2.1.
Windows 2000 Issues
- Debugger May Crash on Windows 2000 Beta 3.
A late-breaking issue may prevent the debugging of Visual C++ applications on Windows 2000 Beta 3. You can compile your applications.
- Debugger may not report exceptions correctly on Windows 2000.
On some releases of Windows 2000, the debugger will not report certain types of exceptions correctly. For example, sometimes the debugger will let the exception pass through to the CRT, where an abort message will be reported. This Windows 2000 issue is expected to be fixed in a future release.
- SDK headers and libraries for Internet Explorer 5 and Windows 2000 not included in Visual Studio Service Pack 3.
Visual Studio Service Pack 3 does not include the latest SDK headers and libraries for Internet Explorer 5 or Windows 2000. The updated headers and libraries for Internet Explorer 5 are available from the Microsoft Web and Internet Samples Download Area. For future Windows 2000 SDK updates, see the MSDN SDK Web page.
- MFC AppWizard generates incorrect column map when using OLE DB ODBC provider and Access
If you generate an MFC database application using OLE DB and you use the OLE DB ODBC provider on an Access database, the AppWizard might generate a column map with incorrect ordinals in the Set.h file. The workaround is to reset the ordinals starting at 1. For example:
COLUMN_ENTRY_TYPE(2, DBTYPE_I4, m_id)
COLUMN_ENTRY_TYPE(3, DBTYPE_STR, m_field1)
COLUMN_ENTRY_TYPE(4, DBTYPE_STR, m_field2)
COLUMN_ENTRY_TYPE(1, DBTYPE_I4, m_id)
COLUMN_ENTRY_TYPE(2, DBTYPE_STR, m_field1)
COLUMN_ENTRY_TYPE(3, DBTYPE_STR, m_field2)
For more information about the Visual Studio 6.0 SP3 readme, please see the following articles in the Microsoft Knowledge Base:230722
Visual Studio 6.0 SP3 Readme Part 1 - Overview and Installation230724
Visual Studio 6.0 SP3 Readme Part 2 - Visual Studio230726
Visual Studio 6.0 SP3 Readme Part 3 - Visual Basic230729
Visual Studio 6.0 SP3 Readme Part 5 - Visual FoxPro230730
Visual Studio 6.0 SP3 Readme Part 6 - Visual InterDev230731
Visual Studio 6.0 SP3 Readme Part 7 - Visual J++230732
Visual Studio 6.0 SP3 Readme Part 8 - Visual SourceSafe230733
Visual Studio 6.0 SP3 Readme Part 9 - File Versions
Article ID: 230727 - Last Review: June 22, 2014 - Revision: 3.0
Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.