Conversion from ANSI to UNICODE errors

Conversion from ANSI to UNICODE errors

Post by Fausto Lop » Thu, 15 Jul 2004 03:06:23


Can any body help to figure out why the following code generates the
following errors at compile time, and also any suggestions on how to fix it?

BACKGROUND INFO
--HRESULT AnsiToUnicode(LPCSTR pszA, LPOLESTR* ppszW) <-- Function
definition
--private:
CString m_saveAsFilename; <-- Private variable definition inside class
--CString fullpath = GetDocument()->GetPathName();

CODE IN QUESTION
-- AnsiToUnicode(m_saveAsFilename,&m_pwBuffer);
-- AnsiToUnicode(fullpath,&m_pwBuffer);

ERROR MESSAGED FOR BOTH FUNCTION CALLS
error C2664: 'AnsiToUnicode' : cannot convert parameter 1 from 'class
CString' to 'const char *'
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called


Fausto
 
 
 

Conversion from ANSI to UNICODE errors

Post by Jonathan W » Thu, 15 Jul 2004 03:27:27

Are you compiling with _UNICODE defined?

If so, CString will contain Unicode strings and will only be able to
automatically convert to w_char*.

--
Jonathan Wood
SoftCircuits
http://www.yqcomputer.com/
Available for consulting: http://www.yqcomputer.com/




it?
class
this

 
 
 

Conversion from ANSI to UNICODE errors

Post by Relvinia » Thu, 15 Jul 2004 13:22:10

Fausto,

What this error message is saying is that the compiler can't convert a
CString object to a const char*. You will need to double type-cast the
CString object to get it into a const char* format.

Example:

(LPCSTR)(LPCTSTR)m_saveAsFilename
(LPCSTR)(LPCTSTR)fullpath

Also note:
If you are compiling the project with _UNICODE defined, CString
automatically uses unicode as the default (could be why you are receiving
this compiler error message). This could cause problems with your
type-casting if you have it so. If you don't have _UNICODE defined, the
double type-cast should work ok for you.

Relvinian



it?
class
this
 
 
 

Conversion from ANSI to UNICODE errors

Post by Alexander » Thu, 15 Jul 2004 13:27:02

Don't do those casts. You're just masking the error.
 
 
 

Conversion from ANSI to UNICODE errors

Post by Relvinia » Thu, 15 Jul 2004 13:46:04

I wouldn't necessarily do them --- besides, if you watch the "guts", meaning
looking at the assembly, a pointer is a pointer, doesn't matter what type it
is. Just a four-byte value!

But if you know what the data is and are always aware, you'll be ok. Of
course, the better solution is finding out why!

But if you *always* compile for ANSI systems and you are using a CString
object and trying to pass data to a const char*, type casting is just fine.
But the question remains, why are you using CString or trying to pass data
to a const char* function instead of a (possible) w_char* function?

Relvinian





receiving


fix
 
 
 

Conversion from ANSI to UNICODE errors

Post by GuitarBil » Thu, 15 Jul 2004 14:17:21

That could be quite a useful debugging tool - if [when] your program crashes
you could just look for these: (LPCSTR)(LPCTSTR) and immediately find where
the problem is.

Bill
 
 
 

Conversion from ANSI to UNICODE errors

Post by Mihai N » Thu, 15 Jul 2004 19:10:24

> --CString fullpath = GetDocument()->GetPathName();
You try to use the CString as a target for the function.
This does not work.
You should get a buffer big enough (GetBuffer or GetBufferSetLength)
use this as a parameter to your call, then release it
(ReleaseBuffer or ReleaseBufferSetLength)

And you should be carefull that the CString is ANSI.
And with Dev.Studio 6 or older the only way to do this is
to have a non-unicode application.


--
Mihai
-------------------------
Replace _year_ with _ to get the real email
 
 
 

Conversion from ANSI to UNICODE errors

Post by Alexander » Thu, 15 Jul 2004 22:45:50

ou don't need a cast to get LPCTSTR from CString (other than when passing
it to a printf/Format).

"Relvinian" < XXXX@XXXXX.COM > wrote in message
news: XXXX@XXXXX.COM ...
meaning
it
fine.
the
the
inside
'class
perform