Re: CString question
On Feb 11, 2:54 pm, "Doug Harrison [MVP]" <d...@mvps.org> wrote:
On Mon, 11 Feb 2008 12:28:54 -0800 (PST), catfish <phym...@gmail.com>
wrote:
Thanks much for your help.
Well, there is no /DUNICODE or /D_DUNICODE in all project settings.
strlen(str2) retunred 1. wcslen() failed.
This indicates that the code calling these functions is using an ANSI
CString.
The application first failed in the release build, then I debugged
into it and found out why.
Where does your "stored procedure" live compared to the code that calls it=
?
If they are in different modules, i.e. EXE and DLL or different DLLs, both=
must link to the same CRT DLL in order to share C++ objects in this way.
The compiler setting is "Use multithreaded CRT in a DLL" (or something
similar), and it must be the same CRT DLL, i.e. no mixing of debug and
release modes. Again, both modules must use the same Unicode settings.
Could you please help a bit about how to
look at raw memory?
You would first get the address of the object in the debugger, and then yo=
u
would open a memory window on it. You would correlate the memory contents
with the class definition. For CString, you should be able to expand it in=
the debugger "Autos" window until you get to the m_pszData member, which
contains the address of the memory you need to examine. While it's typed a=
s
a TCHAR*, it actually points to a CStringData object, and this class is
defined in atlsimpstr.h (VC9):
struct CStringData
{
IAtlStringMgr* pStringMgr; // String manager for this C=
StringData
int nDataLength; // Length of currently used data in XC=
HARs (not
including terminating null)
int nAllocLength; // Length of allocated data in XCHARs=
(not including
terminating null)
long nRefs; // Reference count: negative == lo=
cked
// XCHAR data[nAllocLength+1] // A CStringData is alway=
s followed in
memory by the actual array of character data
...
};
The character data is tacked on to the end, so for Win32, it would be
located 16 bytes past the start of the object.
--
Doug Harrison
Visual C++ MVP
Thanks so much for your detailed reply, it is so helpful to me.
str2 is created in a separate DLL, both project settings appear fine,
compiler option for CRT is defined as Runtime Library: Multi-threaded
DLL.
Memory dump is consistent with what showed on debug window:
str2:
0x023B0428 4e 00 cd cd cd cd cd cd cd cd cd cd cd cd cd cd
N.=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD
0x023B0438 cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd
=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD
0x023B0448 cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd
=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD
0x023B0458 cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd
=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD
0x023B0468 cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd
=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD=CD
str1:
0x003EDB50 4e fd fd fd fd ab ab ab ab ab ab ab ab fe ee fe
N=FD=FD=FD=FD=AB=AB=AB=AB=AB=AB=AB=AB=FE=EE=FE
0x003EDB60 00 fd fd fd fd ab ab ab ab ab ab ab ab fe ee
fe .=FD=FD=FD=FD=AB=AB=AB=AB=AB=AB=AB=AB=FE=EE=FE
0x003EDB70 00 00 00 00 00 00 00 00 0f 00 0c 00 ee 04 ee
00 ............=EE.=EE.
0x003EDB80 f0 01 3e 00 f0 01 3e 00 ee fe ee fe ee fe ee fe
=F0.>.=F0.>.=EE=FE=EE=FE=EE=FE=EE=FE
0x003EDB90 ee fe ee fe ee fe ee fe ee fe ee fe ee fe ee fe
=EE=FE=EE=FE=EE=FE=EE=FE=EE=FE=EE=FE=EE=FE=EE=FE
Something must be wrong, I just couldn't figure out where :( :(