
| Last Modification: January 21, 2001 |
How can I convert a CString variable to char* or LPTSTR?
This is a common question, due to the fact that several Win32 APIs take char*
or LPTSTR parameters, and CString only provides a LPCTSTR overloaded operator,
which won't work on these cases. You can go two ways:
CString::GetBuffer(). It can be used in a manner similar to this:
// prototype of a function that takes a LPTSTR parameter
// presented for argument's sake.
void test_func ( LPTSTR lpszString, int length );
CString string;
test_func ( string.GetBuffer ( 50 ), 50 );
string.ReleaseBuffer ( );
Forgetting to call CString::ReleaseBuffer() can cause problems very difficult to debug
as it releases the lock on CString's inner buffer.
One thing to keep in mind about CString::GetBuffer() is that it
returns a TCHAR* value (or LPTSTR, it's the same), so it is subject to the same
ANSI/MBCS Vs. UNICODE convertions as most other Win32 APIs. It also means that if
you're compiling a unicode version of your application, and specifically need a
char* from your CString instance, you'll have to use a separate buffer of the
appropriate type, and then make the convertion to unicode using one of the available
API's before asigning it's value to the CString instance. The same goes if you're
doing the exact opposite: getting a WCHAR* out of a CString, while compiling in
MBCS mode.
char temp[256];
CString string;
test_func ( temp, 256 );
string = temp;