Microsoft KB Archive/230727

= INFO: Visual Studio 6.0 SP3 Readme: Part 4 - Visual C++ =

Article ID: 230727

Article Last Modified on 1/23/2007

-

APPLIES TO


 * Microsoft Visual Studio 6.0 Service Pack 3

-



This article was previously published under Q230727



SUMMARY
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.

ATL Fixes
The following ATL issues have been fixed:


 * 190531 Crashing when passing a NULL pointer to the (ATL-overridden) delete operator or free function.
 * 191626 CComVariant > and < operators cause LNK2001 errors.
 * 194180 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.
 * 198019 Some ATL controls did not size properly.
 * Registering an ATL server with a long pathname failed.
 * 217182 Descriptions weren't added to registry when using the DECLARE_REGISTRY macro.
 * 218829 CComEnumImpl<>::Skip didn't handle overflow correctly.
 * 222613 "'m_mov' : undeclared identifier" Error With Alpha Project
 * 223165 GetIDsOfNames Returns DISP_E_UNKNOWNNAME For Named Args

Compiler/Linker/Build Issues
The following build issues have been fixed:  187280 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. 192539 A friend << operator would not compile if defined outside the class. 194615 Project Deletes Precompiled Header Created by Other Project.  195376 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: mov        esi,dword ptr [ecx+edx*4] mov        ecx,dword ptr [ecx+edx] was incorrectly optimized as follows: mov        esi,dword ptr [ecx+edx*4] mov        ecx,esi   // error, because we were actually trying // to load from a different address.  199736 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. 205681 The use of the ++ operator in a return statement produced access violations when code was compiled with /Od. 216181 In some cases, compiling with /Og generated incorrect code causing the stack frame to be copied before the stack contents were completely set up.</li> 216720 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.</li> 216727 The compiler generated erroneous initializations for const int variables that were initialized with floating-point values.</li> 216715 Bad code generation or an internal compiler error when all of these conditions apply: <ol> Both the left and right hand sides of the colon in a ternary (? :) operator are of class type.</li> The right side is convertible to the left side by way of a user-defined conversion operator.</li> The left side has no constructor that accepts an object of the class specified on the right side.</li></ol> </li> 216716 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.</li> 216718 In some cases, compiling with /Zi and /Yc produced a C1001 internal compiler error.</li>  216722 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 *)> class NewClass { public: int Test(T *pb) {  return (*pfn)(pb); } }; int Bar( BOGUS *pb ) {  return pb->m_i; } void main (void) {  BOGUS b;   b.m_i = 6; Foo < BOGUS, &Bar > foo; foo.Test(&b); }                   </li> 216731 Code failed to call the destructor of an explicitly constructed anonymous temporary.</li>  216747 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: inc eax mov [eax + 2*eax + 3] </li> 216854 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.</li> 217033 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.</li> 195377 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").</li> 217171 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.</li> <li>217168 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.</li> <li>217164 Bad code was generated when the result of an intrinsic was passed to a function that takes an int& argument.</li> <li>217755 #import ignored TKIND_MODULE members of a type library.</li> <li>218611 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.</li> <li>218613 In some cases, when using delay-load imports on the Alpha platform, the linker produced invalid fixups and silently produced a bad image.</li> <li>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.</li></ul>

CRT Issues
The following CRT issue has been fixed in Service Pack 3:
 * 214661 Daylight Saving Time Bug in C Run-Time Library.

The following CRT issues have been fixed in previous service packs and are included in Service Pack 3.

Service Pack 1:


 * 193509 In a multithreaded application, one thread calling setlocale while another thread was executing strftime could result in an access violation exception.

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:
 * 190536 PRB: Invalid page fault in Msvcrt.dll.
 * 194550 PRB: Freeing memory multiple times may cause an access violation.
 * When installing, several of the CRT heap management files are overwritten by updated files that include the code for both the Visual C++ 6.0 heap and the Visual C++ 5.0 heap. If you need to rebuild the Visual C++ 6.0 static libraries, the Visual C++ 5.0 heap code will be included in your static library. It will not be used. The Visual C++ 5.0 heap was added to the SP2 release to prevent compatibility problems that can arise due to the problems listed earlier. If you do not want the Visual C++ 5.0 code to be included in your rebuilt static library, you should rebuild the library using the original code that was released with Visual C++ 6.0.

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:


 * dao360.dll
 * dao360.chm

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: <pre class="fixed_text">DAO SDK Headers      DAO SDK Source -- _dbdao.h             dbdaouid.cpp dbdaoerr.h           resource.h dbdaoid.h             version.rc dbdaoint.h            stdafx.h version.usr           dbdao.dsp daogetrw.h           Dbdao.dsw VERSTAMP.H           dbdao.mak VERSION.H            dbdao.rc Dbdao.h               Dbdao.cpp

To Build the DAO Libraries

 * 1) Copy the DAO SDK Headers and Source files to a directory on a computer running Visual Studio.
 * 2) In Visual C++, open DBDAO.DSW.
 * 3) From the Build menu, choose Configurations, and select the type of library you want to use.
 * 4) From the Build menu, choose Build . You can build multiple dlls at the same time by choosing Batch Build from the Build menu.
 * 5) 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.

Debugger Issues
The following debugger issues have been fixed:


 * 198839 Possible failure of an asynchronous break on a multiprocessor computer when the breakpoint has been encountered more than once.
 * 217369 The debugger would crash, hang, or emit low resource warnings when remotely debugging a program with frequent calls to OutputDebugString.
 * 217437 The debugger would crash if two symbols in the debug information had the same hash value.
 * 218612 Remote debugging did not work on the Alpha platform.

IDE Issues
The following Integrated Development Environment (IDE) issues have been fixed: <ul> <li>193478 IDE crashed when the running of a macro caused repeated exceptions.</li> <li>193476 IDE would freeze or exit when trying to display a DataTip popup on _asm or __asm.</li> <li>194843 When attempting to access the CreateObject or GetObject functions from the IDE, VBScript displayed the following error message:

Line #: ActiveX component can't create object 'CreateObject'

Calls to these functions sometimes succeeded despite the error message.

</li> <li>195375 Redrawing of the ClassView pane was slow when using Visual SourceSafe.</li> <li>216849 IDE crashed when doing a Save As of a utility project.</li> <li>216869 IDE crashed when the user attempted to mark and delete a line while a function parameter DataTip was visible.</li> <li>216868 In some cases, the IDE exited without warning when the user created a derived class in the source editor.</li> <li>216853 IDE crashed when repeatedly executing the Documents.Open macro on a file that does not exist.</li> <li>216851 Calls to the Developer Studio object method AddConfiguration failed when AddConfiguration was used in a MakeFile project.</li></ul>

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: <ul> <li> Linking with the DLL version of MFC and adding the following line to InitInstance before you make any database-related calls: AfxGetModuleState->m_dwVersion = 0x0601 - or - </li> <li>Recompile the MFC static libs with _MFC_VER set to 0x0601.</li></ul>

MFC Fixes
The following MFC issues have been fixed:
 * 190518 MFC AppWizard associated incorrect images with toolbar buttons for SDI applications that did not use the document/view architecture.
 * 193101 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.
 * 194300 Asserts occurred when creating a dialog box in an MFC regular DLL.
 * 197448 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.
 * 216850 MFC AppWizard applications with no document/view architecture, initial status bar, or docking toolbar would crash on an assert statement.
 * 217208 CMenu::GetMenuString did not properly handle strings over 256 bytes, resulting in possible corruption.
 * 217201 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.
 * 217216 CDaoDatabase::CreateRelation called Release beyond the reference count, causing an assertion.
 * 225140 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:
 * 192942 ActiveX controls that resize themselves in response to being moved would cause a stack overflow.
 * 193099 CDialog::Create did not return FALSE when dialog creation failed.
 * 193102 Inappropriate assertions were raised in debug builds in some Automation routing situations involving nested activations.
 * 193100 Deserializing an ANSI string in a UNICODE release build of MFC caused an access violation.
 * 193272 MFC DLLs created with Visual C++ 6.0 did not call CPrintDlg::OnInitDialog, causing programs that depended on this initialization routine to fail.

Multilanguage Issues
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:
 * 191738 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.
 * 217218 OLE DB Templates used DBFILETIME instead of FILETIME.
 * 218929 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.
 * 223180 FIX: DB_E_ERRORSOCCURRED From Jet Provider During OpenDataSource.

OLE DB Provider Issues
The following OLE DB Provider issues have been fixed:
 * 201387 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.
 * 217181 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.
 * 217183 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.
 * 217185 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.
 * 217186 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.
 * 217187 A failure in InternalCreateSchemaRowset caused an access violation.
 * 217188 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:
 * 206665 The Get Latest Version command did not reload all projects that had been changed. If more than one workspace was open on a computer and the project settings were changed in each project on another computer, then the project settings were not updated for all projects. If more than two workspaces were changed, then not all were refreshed.

Known Issues
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.


 * Record deletion causes loss of cursor position with ADO or Microsoft Access ODBC driver. For important information about a known issue with the MDAC 2.1 ODBC driver, see Access ODBC Keyset Cursor Becomes Corrupt After a Delete at:

http://support.microsoft.com/support/kb/articles/Q230/1/31.asp

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.

<ul> <li> 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: BEGIN_COLUMN_MAP(CMyTable) COLUMN_ENTRY_TYPE(2, DBTYPE_I4, m_id) COLUMN_ENTRY_TYPE(3, DBTYPE_STR, m_field1) COLUMN_ENTRY_TYPE(4, DBTYPE_STR, m_field2) END_COLUMN_MAP

should be:

BEGIN_COLUMN_MAP(CMyTable) COLUMN_ENTRY_TYPE(1, DBTYPE_I4, m_id) COLUMN_ENTRY_TYPE(2, DBTYPE_STR, m_field1) COLUMN_ENTRY_TYPE(3, DBTYPE_STR, m_field2) END_COLUMN_MAP </li></ul>

<div class="references_section">