Ууууууу, как всё запущено!!! Вы чего а?
можно как-нибудь тип CString преобразовать в тип LPTSTR?
А никак нельзя! Это абсолютно разные типы данных - LPTSTR - это указатель - 32 битное целое число.
Строка - это массив 8ми битных символов - 8бит * N - где N - число символов в строке.
Ну и как вы их собираетесь преобразовывать?
То, что ты хочешь сделать является не преобразованием, а копированием.
Поэтому правильным ответом на вопрос будет:
Можно скопироваить содержимое буфера объекта CString в другой буфер,
доступный через указатель типа LPTSTR.
То что предложил asker, есть не что иное, как доступ к внутреннему буферу объекта CString. Если оригинальный объект перестанет существовать, то указатель будет недействительным:
{
LPTSTR pszTest = NULL;
if(TRUE)
{
CString st1(_T("I'm string"));
pszTest = st1.GetBuffer(st1.GetLength());
}
// здесь оригинальный буфер уже потерян
AfxMessageBox(pszTest);
}
Таким образом, как это здесь записано:
CString str;
LPTSTR ch;
StrCpy(ch, str);
- "расстрелять из крупнокалиберного пулемёта" (с)
Передаётся указатель (фактически адрес куска памяти) несуществующего объекта в функцию, которая будет туда что-то копировать. Практически в ch лежит какой-то мусор размером в 32 бита.
Значица так:
1. ПЕРЕМЕННЫЕ ДОЛЖНЫ БЫТЬ ИНИЦИАЛИЗИРОВАНЫ! Те в данном случае будет сразу видно, что LPTSTR есть указатель.
2. LPTSTR на самом деле есть не что иное как укзатель на TCHAR - typedef TCHAR* LPTSTR
3. Перед копированием ОБЯЗАТЕЛЬНО проверять размер целевого буфера, или создавать буфер необходимого размера.
CString stSrc = _T("I'm string.");
int nLen = stSrc.GetLength()+1; // не забываем про 0 в конце строки символов
LPTSTR pszTarget = new TCHAR[nLen];
memset(pszTarget,0,nLen*sizeof(TCHAR)); // обнуляем буфер
_tcscpy(pszTarget, stSrc.GetBuffer(stSrc.GetLength()));
stSrc.ReleaseBuffer();
Примерно так...