Я пытаюсь конвертировать 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..
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);
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 в целом лучше.