C++ LPCTSTR на символ *
Я использую Visual Studio 2010 MFC для создания программы на C++. Моя программа вызывает DLL, которая не является частью проекта, и она принимает символ *. У меня есть функция, которая получает строку в формате LPCTSTR. Я был на Google около двух часов, и решение не найдено. Как преобразовать форму MFC LPCTSTR в символ *. Все, что я нашел, либо не работает, либо просто не компилируется.
2 ответа
В MFC проще всего конвертировать через CStringA
(при условии, что результирующий буфер будет аргументом только для чтения):
LPCTSTR pszA = ...
CStringA sB(pszA);
const char* pszC = sB;
char* pszD = const_cast<char*>(pszC);
Другие варианты доступны и были обсуждены:
- C++ конвертировать из LPCTSTR в const char *
- Как конфертировать из LPCTSTR в LPSTR?
WideCharToMultiByte
,T2A
макросы и т. д.
LPCTSTR patientName= L"";
CStringA sB(patientName);
const char* pszC = sB;
DcmFileFormat fileformat;
//Type casting below to const char * str
OFCondition status = fileformat.loadFile(((LPCSTR)(CStringA)str));
if (status.good())
{
if (fileformat.getDataset()->findAndGetString(DCM_PatientName, pszC).good())
{
//Type casting from const char * to LPCTSTR
m_List.InsertColumn(4, LPCTSTR(pszC) , LVCFMT_LEFT, 100);
}
}
Это был способ, которым я использовал, чтобы типизировать переменные
LPCTSTR
либо определяется как const wchar_t *
или const char *
в зависимости от того, определил ли ваш проект символ препроцессора UNICODE
(или же _UNICODE
Я забыл, какой MFC использует).
Таким образом, решение вашей проблемы зависит от того, используете ли вы настройку UNICODE или нет.
Если вы используете его, вам нужно преобразовать строку в узкую строку. использование CStringA
сделать это.
Если вы не используете UNICODE, вам нужно будет сделать изменяемую копию и передать ее в DLL, если она захочет изменить строку. Вы можете сделать это, создав копию с помощью CString
,
В любом случае, если у вас есть копия в CString
объект затем использовать GetBuffer
метод, чтобы получить изменяемый указатель на строку, вызвать функцию DLL, а затем вызвать ReleaseBuffer
после звонка.