从常量字符 * 转换为 LPTSTR 而不USES_CONVERSTION
Converting from const char * to LPTSTR without USES_CONVERSTION
我正在尝试将常量字符*转换为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 文档,LPSTR
是char *
的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 字符串通常更好。
相关文章:
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 为什么使用SFINAE而不是函数重载
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- MSVC是否支持C++11样式的属性而不是__declspec
- CoInitialize()在单独的线程上崩溃而不返回
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- GlobalAlloc而不是其他分配方法
- 当比特(而不是字节)的顺序至关重要时的持久性
- 为什么复制而不是移动数据元素?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- () 函子后面的括号,而不是函数指针?
- 为什么是谷神星协方差.计算()似乎永远运行而不返回?
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 将所有模板类型传递给运算符,而不指定所有类型
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数