Преобразование из const char * в LPTSTR без USES_CONVERSTION

Я пытаюсь конвертировать const char * в LPTSTR. Но я не хочу использовать USES_CONVERSION для этого.

Ниже приведен код, который я использовал для преобразования с помощью USES_CONVERSION. Есть ли способ конвертировать, используя sprintf или tcscpy, и т.д ..?

USES_CONVERSION;
jstring JavaStringVal = (some value passed from other function);
const char *constCharStr = env->GetStringUTFChars(JavaStringVal, 0);
LPTSTR lpwstrVal = CA2T(constCharStr); //I do not want to use the function CA2T..

6

Решение

LPTSTR имеет два режима:

LPWSTR если UNICODE определяется, LPSTR иначе.

#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;
#endif

или другим способом:

LPTSTR is wchar_t* or char* depending on _UNICODE

если твой LPTSTR не является юникодом:

в соответствии с MSDN Полный MS-DTYP IDL документация, LPSTR это typedef из char *:

typedef char* PSTR, *LPSTR;

так что вы можете попробовать это:

const char *ch = "some chars ...";
LPSTR lpstr = const_cast<LPSTR>(ch);
8

Другие решения

USES_CONVERSION и связанные макросы — самый простой способ сделать это. Почему бы не использовать их? Но вы всегда можете просто проверить, определены ли макросы UNICODE или _UNICODE. Если ни один из них не определен, преобразование не требуется. Если один из них определен, вы можете использовать MultiByteToWideChar выполнить преобразование.

На самом деле это глупо. У JNIEnv уже есть метод для получения символов в Unicode: JNIEnv :: GetStringChars. Так что просто проверьте макросы UNICODE и _UNICODE, чтобы узнать, какой метод использовать:

#if defined(UNICODE) || defined(_UNICODE)
LPTSTR lpszVal = env->GetStringChars(JavaStringVal, 0);
#else
LPTSTR lpszVal = env->GetStringUTFChars(JavaStringVal, 0);
#endif

На самом деле, если вы не хотите передать строку в метод, который ожидает LPTSTR, вы должны просто использовать только версию Unicode. Строки Java хранятся как Unicode внутри, так что вы не получите накладных расходов на преобразование, плюс строки Unicode в целом лучше.

0

По вопросам рекламы [email protected]