BUG: ATL Registrar Code Does Not Handle DBCS Correctly (239909)
The information in this article applies to:
- The Microsoft Active Template Library (ATL) 3.0
- The Microsoft Active Template Library (ATL) 2.0
- The Microsoft Active Template Library (ATL) 2.1
This article was previously published under Q239909 SYMPTOMS When you register an ATL object on a system that uses a
double-byte character set (DBCS), ATL might put garbage characters in the
registry entry for the object. CAUSE In the AddString function in ATL 3.0 in file StatReg.h,
lpszT++ is used to walk a character buffer, and then characters are added at
that position. If the buffer contains DBCS characters, this will cause
corruption in the string because ATL fails to take into account the 2-byte
characters.
The function CParseBuffer::AddString in ATL 2.0 and 2.1
in file StatReg.cpp has the same problem. RESOLUTIONSteps to Fix the Problem for ATL 2.0 and 2.1- In StatReg.cpp, find the CParseBuffer::AddString
function.
- On line 8 of the AddString function, change
lpszT++
to:
lpszT = CharNext(lpszT);
- Save StatReg.cpp so the changes will be
retained.
- Rebuild the project with a Release MinDependency build
configuration. (If you do not build with this option, you would have to add
_ATL_STATIC_REGISTRY to the preprocessor definitions of the project so ATL
would add the registration code to your project. You would also have to remove
the _ATL_DLL preprocessor option. You do not have to add _ATL_STATIC_REGISTRY
if you are building with a Release MinDependency build configuration because it
is already defined.)
- Rebuild the project.
By using this procedure, the registration code for any COM
objects in the project will be statically linked and will not use the incorrect
code in Atl.dll. This will also add about 5 KB to the size of the executable or
DLL. Steps to Fix the Problem for ATL 3.0- In StatReg.h, find the AddString function.
- On line 8 of the AddString function, change
lpszT++
to:
CharNext(lpszT)
- Save StatReg.h so the changes will be retained.
- Rebuild the project with a Release MinDependency build
configuration. (If you do not build with this option, you would have to add
_ATL_STATIC_REGISTRY to the preprocessor definitions of the project so ATL
would add the registration code to your project. You would also have to remove
the _ATL_DLL preprocessor option. You do not have to add _ATL_STATIC_REGISTRY
if you are building with a Release MinDependency build configuration because it
is already defined.)
- Rebuild the project.
By using the above steps, the registration code for any
COM objects in the project will be statically linked and will not use the
incorrect code in ATL.DLL. This will add about 10 KB to the size of the
executable or DLL. STATUSMicrosoft has confirmed that this is a bug in the Microsoft
products that are listed at the beginning of this article.
Modification Type: | Major | Last Reviewed: | 9/23/2003 |
---|
Keywords: | kbBug kbpending kbRegistry KB239909 |
---|
|