Hi, Hiran,
If you're using VC++, it's best to use
CString for portability between ANSI and UNICODE build.
Though the type of CString's internal
storage changes according to the "UNICODE" directive, there are several
macros that can help you to transcode a TCHAR string into an ANSI string
or a UCS2 string. See the code snippet below:
#include <atlvbase.h>
#include<atlconv.h>
......
void myUnicodeFunc(LPCWSTR
lpszUnicodeText);
void myAnsiFunc(LPCSTR
lpszAnsiText);
......
void myfunc(LPCTSTR
lpszMyText)
{
USES_CONVERSION;
myUnicodeFunc(T2W((LPTSTR)lpszMyText));
myAnsiFunc(T2A((LPTSTR)lpszMyText));
}
Definition of these macros will also
change according to the "UNICODE" directive. i.e., if you compile your
code as UNICODE, the T2W macro will be obmitted and the T2A macro will call a
helper function to transcode the unicode string into ANSI. And vice
versa.
There are a lot of other ATL macros
like T2A, A2T, A2W... etc. To use them you need to include 2 header files
and declare the "USES_CONVERSION" macro in your function.
And remember these macros uses temporary
variables, so you can not store the pointer for later use. And it's not
recommended to put them in a loop. Consult your MSDN for more
information.
regards
Lei
----- Original Message -----
From: "Chaudhuri, Hiran" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, February 06, 2004 9:25
PM
Subject: RE: MemBufInputSource with
CString
Makes sense. Will try it when I get that far. Thank you.
Hiran
> -----Original Message-----
> From: Alberto Massari [mailto:[EMAIL PROTECTED]
> Sent: Friday, February 06, 2004 1:14 PM
> To: [EMAIL PROTECTED]
> Subject: RE: MemBufInputSource with CString
>
>
> At 12.36 06/02/2004 +0100, Chaudhuri, Hiran wrote:
> >Hi, Lei.
> >
> >Having followed this thread, a question arises for me.
> >I am in a similar situation with an application that keeps its
> >configuration in an XML file. This file is also intended to contain
> >localized messages. I thought that to be a good idea as XML
> should handle
> >Unicode, and of course I'd compile my VC++ appication with Unicode,
> >expecting CString to work on 16 bit characters (or whatever
> appropriate)
> >to support Japanese messages.
> >
> >Now how do I have to use the unicode CString with Xerces? Is there a
> >suitable XMLString::transcode method?
>
> When the CString is used with _UNICODE defined, its internal
> storage is the
> same Xerces uses; so you should just cast it using (LPCTSTR).
>
> Alberto
>
> >Hiran
> >
> >
> > > -----Original Message-----
> > > From: jiang lei [mailto:[EMAIL PROTECTED]
> > > Sent: Wednesday, February 04, 2004 9:41 AM
> > > To: [EMAIL PROTECTED]
> > > Subject: Re: MemBufInputSource with CString
> > >
> > >
> > > Hi Jimmy,
> > >
> > > A few suggestions:
> > >
> > > 1.in your function void X(CString setting, CString changeval) ,
> > > Passing parameters by object is usually not a good idea.
> > > Unless, of course
> > > you want to make copies and leave the masters intact.(
> CString's copy
> > > constructor, however, will share the master's buffer if the
> > > LPCTSTR() cast
> > > is not used.)
> > >
> > > 2. Notice that CString's internal buffer is of type "TCAR"
> > > rather than the
> > > intrinsic c type "char". It will change into "wchar_t" if
> > > someone compiles
> > > your program with a "UNICODE" directive. I'd preffer
> > > std::string in this
> > > case. But in your program I did not see any necessity to
> use a string
> > > object. A simple "const char*" pointer will work just fine.
> > >
> > > 3. AFAIK XercesDOMParser will delete it's internal
> document in it's
> > > destructor. So if you delete the parser in ParseDocument(), the
> > > "DOMDocument"pointer you returned will be invalid and cause a
> > > protection
> > > fault if you try to use the object. On the other hand if you
> > > don't delete
> > > it, there will be a memory leak. So your program can either:
> > > keep a pointer to the parser when you use "new" to
> > > create it. Make sure
> > > the parser lives long enough until you've finished using
> it's internal
> > > document object. and then delete the parser.
> > > or
> > > make a copy of the parser's internal document and
> > > delete the parser in
> > > ParseDocument();
> > >
> > > remember in C++ every object created with "new" should be
> > > destructed with
> > > "delete", and it's up to you to keep those objects valid.
> > >
> > >
> > >
> > > regards
> > >
> > > Lei
> > >
> > >
> > >
> > >
> ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > For additional commands, e-mail: [EMAIL PROTECTED]
> > >
> > >
> >
> >---------------------------------------------------------------------
> >To unsubscribe, e-mail: [EMAIL PROTECTED]
> >For additional commands, e-mail: [EMAIL PROTECTED]
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]