8

我正在尝试将 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..
4

2 回答 2

11

LPTSTR有两种模式:

一个LPWSTRifUNICODE被定义,一个LPSTRelse 。

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

或以另一种方式:

LPTSTR is wchar_t* or char* depending on _UNICODE

如果你LPTSTR是非 unicode:

根据MSDN Full MS-DTYP IDL文档,LPSTRtypedefchar *

typedef char* PSTR, *LPSTR;

所以你可以试试这个:

const char *ch = "some chars ...";
LPSTR lpstr = const_cast<LPSTR>(ch);
于 2013-02-04T08:22:09.290 回答
0

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 字符串通常更好。

于 2013-02-04T08:19:22.647 回答