从常量字符 * 转换为 LPTSTR 而不USES_CONVERSTION

Converting from const char * to LPTSTR without USES_CONVERSTION

本文关键字:而不 USES CONVERSTION LPTSTR 常量 字符 转换      更新时间:2023-10-16

我正在尝试将常量字符*转换为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有两种模式:

如果定义了UNICODE则为LPWSTR,否则为LPSTR

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

或者通过其他方式:

LPTSTR is wchar_t* or char* depending on _UNICODE

如果您的LPTSTR是非 Unicode:

根据 MSDN 完整的 MS-DTYP IDL 文档,LPSTRchar *typedef

typedef char* PSTR, *LPSTR;

所以你可以试试这个:

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

USES_CONVERSION和相关宏是最简单的方法。为什么不使用它们?但是您始终可以检查是否定义了 UNICODE 或_UNICODE宏。如果两者都未定义,则无需转换。如果定义了其中一个,则可以使用多字节到宽字符来执行转换。

JNIEnv alreay 有一种方法可以将字符获取为 Unicode:JNIEnv::GetStringChars。因此,只需检查UNICODE和_UNICODE宏即可找出使用哪种方法:

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

事实上,除非你想将字符串传递给需要 LPTSR 的方法,否则你应该只使用 Unicode 版本。Java 字符串在内部存储为 Unicode,因此您不会获得转换的开销,而且 Unicode 字符串通常更好。