|
The c_str() method is a member of both string and wstring . Is that what you are asking?
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
No, I am verifying that even though he is using std::string (ANSI) instead of std::wstring (Unicode/Wide), he can still expect to get a const WCHAR* returned by std::string::c_str() ? I am under the impression that he will get a const char* from std::string::c_str() , and a const WCHAR* (or const wchar_t* ) from std::wstring::c_str() .
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!)
|
|
|
|
|
Because string.c_str() returns a char* is why I indicated it would need to be a minimum. A typecast would still need to be applied (to make it wide). I don't use the STL, but a better solution would be to use wstring instead.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
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: while casting it to WCHAR* will allow the code to compile, it will not work correctly.
From the context, I think he meant casting the entire string, and not the pointer.
--
Mr. Bender's Wardrobe by ROBOTANY 500
|
|
|
|
|
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.
|
|
|
|
|
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::wstring::c_str() returns a const WCHAR* (const wchar_t* ), but not std::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 a std::string (ANSI) object and needs to get a (presumably valid) const WCHAR* (Unicode) out of it.
Since they cannot simply change the strings from std::string to std::wstring , they are stuck with ANSI string objects, and no amount of casting is going to create a valid wide string from the return of std::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. 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
|
|
|
|
|
ummm seems that would do the reverse of what I want. I want to go to a wide string from a cstr.
|
|
|
|
|
As I do not use the STL, I did not want to commit to a definite solution. That's why I prefaced it with, "At a minimum." From there you could have just cast it to a WCHAR* . A better solution is to use a wstring instead.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
MultiByteToWideChar(...) is the de-facto way to convert from ANSI to Unicode (Wide) strings, so you can look into that.
For something a little more Q&D, look into the (ATL) Conversion Macros like A2WC(...) , T2WC(...) , etc. Note that on VC++ 6.0, these macros use the _alloc(...) function (if a conversion is required) so you have to be careful using them directly in loops.
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!)
|
|
|
|
|
Don't think I can use ATL and not sure how I would do that anyway yet. I'm programming a win32 dll.
|
|
|
|
|
You can use the conversion macros without adding "real" ATL support to your project.
Anyway, MultiByteToWideChar(...) is likely the way to go - look it up in MSDN for usage info.
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!)
|
|
|
|
|
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
|
|
|
|
|
Use a wstring and call the c_str() method on it.
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
|
|
|
|
|
Would if I could, but I am given a c_str and must convert it to a wide, hence the question.
|
|
|
|
|
Stick^ wrote: Would if I could, but I am given a c_str and must convert it to a wide, hence the question.
c_str() is a method of wstring . No conversion is necessary as it is already "wide."
Now if you are unable to change std::string to std::wstring , that's a different problem.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
You are given a const char* you mean?
If that is the case, use MultiByteToWideChar to convert the const char* to an array of const wchar_t* and pass that to your draw function (NOTE: that will only work for UNICODE builds -- for a more generic approach, look at the A2T macro)
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.
|
|
|
|
|
Have you tried "mbstowcs" or "mbstowcs_s" in stdlib.h.
std::string mbstr = "The string!";<br />
std::vector<wchar_t> wcstr(mbstr.size() + 1, L'\0');<br />
<br />
size_t written = 0;<br />
mbstate_t state = {0};<br />
const char* pmbstr = mbstr.c_str();<br />
<br />
errno_t result = mbsrtowcs_s(&written, &wcstr[0], <br />
wcstr.size(), &pmbstr, mbstr.size(), &state);<br />
<br />
std::wcout << &wcstr[0] << std::endl;
-- modified at 20:19 Thursday 28th September, 2006
|
|
|
|
|
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
|
|
|
|
|
Thanks. Would help if I followed everyone's directions!
|
|
|
|
|
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
|
|
|
|