std::string to const WCHAR*
-
You mean to create a temporary, as in
wstring( sTheString.c_str() )
? I do not think that will work, either... Unless I am missing the intent of your smiley, that is. Peace!-=- James
If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
DeleteFXPFiles & CheckFavorites (Please rate this post!)Naw, more likely using CA2CW or something along those lines. My bet's on that David's a bit too experienced to fall for the (wchar_t*)str.c_str() and similar newbie mistakes. :)
-
Don't think I can use ATL and not sure how I would do that anyway yet. I'm programming a win32 dll.
If you are using a fairly new version of MFC (7, 8), you can use the conversion classes such as CA2W without any hassles. Just include atlconv.h in stdafx.h, and you're set.
-- Not a substitute for human interaction
-
No. I'm given a std::string... here's the declaration: string m_ac; Now, if I attempt: m_graphics->DrawString(m_ac, -1, &font, PointF(8,8), NULL, &grnbrush); I get: Error 1 error C2664: 'Gdiplus::Status Gdiplus::Graphics::DrawString(const WCHAR *,INT,const Gdiplus::Font *,const Gdiplus::RectF &,const Gdiplus::StringFormat *,const Gdiplus::Brush *)' : cannot convert parameter 1 from 'std::string' to 'const WCHAR *' so as you can clearly see, the m_ac is NOT already wide. I have tried to do something like this: WCHAR str[20+1] = L""; WideCharToMultiByte(CP_ACP, 0, m_ac.c_str(), -1, str, wcslen(str)+1, NULL, NULL); but this does not work either. Nor does just m_ac in parameter 3.
Stick^ wrote:
WideCharToMultiByte(CP_ACP, 0, m_ac.c_str(), -1, str, wcslen(str)+1, NULL, NULL);
Please use MultiByteToWideChar() instead. You are converting from char to wchar_t, right?
wchar_t buf[20+1] = { 0 };
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_ac.c_str(), m_ac.size(), buf, 20);should do the trick.
-- From the Makers of Futurama
-
The const char* returned by c_str() is not a wide string, while casting it to WCHAR* will allow the code to compile, it will not work correctly. Peace!
-=- James
If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
DeleteFXPFiles & CheckFavorites (Please rate this post!)James R. Twine wrote:
The const char* returned by c_str() is not a wide string,...
So what exactly does
std::wstring::c_str()
return?
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
-
James R. Twine wrote:
The const char* returned by c_str() is not a wide string,...
So what exactly does
std::wstring::c_str()
return?
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
std::**w**string::c_str()
returns aconst WCHAR*
(const wchar_t*
), but notstd::string:c_str()
, which is what the OP was asking about. I think that we (I?) are just getting confused about what "width" of string object is in use here. The OP is dealing with having astd::string
(ANSI) object and needs to get a (presumably valid) const WCHAR* (Unicode) out of it. Since they cannot simply change the strings fromstd::string
tostd::wstring
, they are stuck with ANSI string objects, and no amount of casting is going to create a valid wide string from the return ofstd::string:c_str()
. They need to call a conversion function (either directly or indirectly) in order to translate the string correctly. Peace!-=- James
If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
DeleteFXPFiles & CheckFavorites (Please rate this post!) -
std::**w**string::c_str()
returns aconst WCHAR*
(const wchar_t*
), but notstd::string:c_str()
, which is what the OP was asking about. I think that we (I?) are just getting confused about what "width" of string object is in use here. The OP is dealing with having astd::string
(ANSI) object and needs to get a (presumably valid) const WCHAR* (Unicode) out of it. Since they cannot simply change the strings fromstd::string
tostd::wstring
, they are stuck with ANSI string objects, and no amount of casting is going to create a valid wide string from the return ofstd::string:c_str()
. They need to call a conversion function (either directly or indirectly) in order to translate the string correctly. Peace!-=- James
If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
DeleteFXPFiles & CheckFavorites (Please rate this post!)James R. Twine wrote:
std::wstring::c_str() returns a const WCHAR* (const wchar_t*)...
Which is why I suggested it as a better solution here.
James R. Twine wrote:
...no amount of casting is going to create a valid wide string from the return of std::string:c_str().
Agreed. :-O Blunder on my part.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
-
No. I'm given a std::string... here's the declaration: string m_ac; Now, if I attempt: m_graphics->DrawString(m_ac, -1, &font, PointF(8,8), NULL, &grnbrush); I get: Error 1 error C2664: 'Gdiplus::Status Gdiplus::Graphics::DrawString(const WCHAR *,INT,const Gdiplus::Font *,const Gdiplus::RectF &,const Gdiplus::StringFormat *,const Gdiplus::Brush *)' : cannot convert parameter 1 from 'std::string' to 'const WCHAR *' so as you can clearly see, the m_ac is NOT already wide. I have tried to do something like this: WCHAR str[20+1] = L""; WideCharToMultiByte(CP_ACP, 0, m_ac.c_str(), -1, str, wcslen(str)+1, NULL, NULL); but this does not work either. Nor does just m_ac in parameter 3.
You are compiling with UNICODE defined, so DrawString is mapped to DrawStringW (which takes wide characters). Since you have a string (which are ANSI characters), you need to convert that string to a wstring (or simply to an array of wchar_t's). You'll need to muse MultiByteToWideChar for that (not WideCharToMultiByte).
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week Zac
-
No. I'm given a std::string... here's the declaration: string m_ac; Now, if I attempt: m_graphics->DrawString(m_ac, -1, &font, PointF(8,8), NULL, &grnbrush); I get: Error 1 error C2664: 'Gdiplus::Status Gdiplus::Graphics::DrawString(const WCHAR *,INT,const Gdiplus::Font *,const Gdiplus::RectF &,const Gdiplus::StringFormat *,const Gdiplus::Brush *)' : cannot convert parameter 1 from 'std::string' to 'const WCHAR *' so as you can clearly see, the m_ac is NOT already wide. I have tried to do something like this: WCHAR str[20+1] = L""; WideCharToMultiByte(CP_ACP, 0, m_ac.c_str(), -1, str, wcslen(str)+1, NULL, NULL); but this does not work either. Nor does just m_ac in parameter 3.
-
Stick^ wrote:
WideCharToMultiByte(CP_ACP, 0, m_ac.c_str(), -1, str, wcslen(str)+1, NULL, NULL);
Please use MultiByteToWideChar() instead. You are converting from char to wchar_t, right?
wchar_t buf[20+1] = { 0 };
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_ac.c_str(), m_ac.size(), buf, 20);should do the trick.
-- From the Makers of Futurama
-
You are compiling with UNICODE defined, so DrawString is mapped to DrawStringW (which takes wide characters). Since you have a string (which are ANSI characters), you need to convert that string to a wstring (or simply to an array of wchar_t's). You'll need to muse MultiByteToWideChar for that (not WideCharToMultiByte).
If you decide to become a software engineer, you are signing up to have a 1/2" piece of silicon tell you exactly how stupid you really are for 8 hours a day, 5 days a week Zac
Actually, the OP is using the GDI+ classes, and they tend to always accept wide strings, and not have
A
orW
versions of functions that are aliased-to depending on the build. For example, GDI+'s three versions of theGraphics::DrawString(...)
function all take aconst WCHAR*
as the string type. Peace!-=- James
If you think it costs a lot to do it right, just wait until you find out how much it costs to do it wrong!
Avoid driving a vehicle taller than you and remember that Professional Driver on Closed Course does not mean your Dumb Ass on a Public Road!
DeleteFXPFiles & CheckFavorites (Please rate this post!)