Multi-byte characters?

B

Bob Altman

If I create a new Win32 Console project (unmanaged C++, Visual Studio 2005),
and add the following to the main program:

// Add this above the main routine
#include <windows.h> // Add this at the top of the file

// Add this to the main routine
MessageBox(NULL, "A", "B", MB_OK);

The compiler (Visual Studio 2005) complains that it can't convert parameter
2 from 'const char [2]' to 'LPCWSTR'.

I don't understand why the compiler apparently thinks that I am using
multi-byte character semantics. The really bizarre part is that I have
another project that contains calls to MessageBox, and that project compiles
just fine. I've looked at the project properties in both projects, but I
can't see anything that would obviously cause one to compile correctly and
one to fail to compile.

This all began when I tried to write some code that formats a message and
sends it to the MessageBox function, like this:

ostringstream msg;
msg << "my message expression";
MessageBox(NULL, msg.str().c_str(), "Title", MB_OK);

In this case, the compiler complains that it can't convert parameter 2 from
'const char *' to 'LPCWSTR'. But, as I said, I have this identical code in
another project and it works just fine.

TIA - Bob
 
N

Nathan Mates

I don't understand why the compiler apparently thinks that I am using
multi-byte character semantics.

In DevStudio, this setting can be changed by right-clicking on your
project, selecting properties, then going to Configuration Properties
-> General -> Character Set. Turn off unicode, and go to multibyte
character set.

Nathan Mates
 
E

ewpatton

If I create a new Win32 Console project (unmanaged C++, Visual Studio 2005),
and add the following to the main program:

// Add this above the main routine
#include <windows.h> // Add this at the top of the file

// Add this to the main routine
MessageBox(NULL, "A", "B", MB_OK);

The compiler (Visual Studio 2005) complains that it can't convert parameter
2 from 'const char [2]' to 'LPCWSTR'.

I don't understand why the compiler apparently thinks that I am using
multi-byte character semantics. The really bizarre part is that I have
another project that contains calls to MessageBox, and that project compiles
just fine. I've looked at the project properties in both projects, but I
can't see anything that would obviously cause one to compile correctly and
one to fail to compile.

This all began when I tried to write some code that formats a message and
sends it to the MessageBox function, like this:

ostringstream msg;
msg << "my message expression";
MessageBox(NULL, msg.str().c_str(), "Title", MB_OK);

In this case, the compiler complains that it can't convert parameter 2 from
'const char *' to 'LPCWSTR'. But, as I said, I have this identical code in
another project and it works just fine.

TIA - Bob

You can also put L in front of the string to tell the compiler it
should be expressed as a Unicode string rather than an ASCII string.
 
S

SvenC

Hi,
If I create a new Win32 Console project (unmanaged C++, Visual Studio
2005), and add the following to the main program:

// Add this above the main routine
#include <windows.h> // Add this at the top of the file

// Add this to the main routine
MessageBox(NULL, "A", "B", MB_OK);

The compiler (Visual Studio 2005) complains that it can't convert
parameter 2 from 'const char [2]' to 'LPCWSTR'.

Enclose all strings in _T() that ensures that the correct character type
(char or wchar_t) is used.
I don't understand why the compiler apparently thinks that I am using
multi-byte character semantics. The really bizarre part is that I
have another project that contains calls to MessageBox, and that
project compiles just fine. I've looked at the project properties in
both projects, but I can't see anything that would obviously cause
one to compile correctly and one to fail to compile.

Project properties -> Configuration Properties -> General : Character Set
This all began when I tried to write some code that formats a message
and sends it to the MessageBox function, like this:

ostringstream msg;
msg << "my message expression";
MessageBox(NULL, msg.str().c_str(), "Title", MB_OK);

In this case, the compiler complains that it can't convert parameter
2 from 'const char *' to 'LPCWSTR'. But, as I said, I have this
identical code in another project and it works just fine.

Define t-versions of those STL types based on TCHAR

#include <tchar.h>
#include <string>
#include <sstream>

typedef std::basic_ostringstream<TCHAR> tstringstream;
typedef std::basic_string<TCHAR> tstring;

tstringstream msg;
msg << _T("my message expression");
MessageBox(NULL, msg.c_str(), _T("Title"), MB_OK);

The above compiles with both Unicode and Multi byte settings.
 
B

Bob Altman

Mega cool. Thanks!!!

- Bob

SvenC said:
Hi,
If I create a new Win32 Console project (unmanaged C++, Visual Studio
2005), and add the following to the main program:

// Add this above the main routine
#include <windows.h> // Add this at the top of the file

// Add this to the main routine
MessageBox(NULL, "A", "B", MB_OK);

The compiler (Visual Studio 2005) complains that it can't convert
parameter 2 from 'const char [2]' to 'LPCWSTR'.

Enclose all strings in _T() that ensures that the correct character type
(char or wchar_t) is used.
I don't understand why the compiler apparently thinks that I am using
multi-byte character semantics. The really bizarre part is that I
have another project that contains calls to MessageBox, and that
project compiles just fine. I've looked at the project properties in
both projects, but I can't see anything that would obviously cause
one to compile correctly and one to fail to compile.

Project properties -> Configuration Properties -> General : Character Set
This all began when I tried to write some code that formats a message
and sends it to the MessageBox function, like this:

ostringstream msg;
msg << "my message expression";
MessageBox(NULL, msg.str().c_str(), "Title", MB_OK);

In this case, the compiler complains that it can't convert parameter
2 from 'const char *' to 'LPCWSTR'. But, as I said, I have this
identical code in another project and it works just fine.

Define t-versions of those STL types based on TCHAR

#include <tchar.h>
#include <string>
#include <sstream>

typedef std::basic_ostringstream<TCHAR> tstringstream;
typedef std::basic_string<TCHAR> tstring;

tstringstream msg;
msg << _T("my message expression");
MessageBox(NULL, msg.c_str(), _T("Title"), MB_OK);

The above compiles with both Unicode and Multi byte settings.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top