在没有USES_CONVERSTION的情况下从const char *转换为LPTSTR

时间:2013-02-04 07:54:56

标签: c++ java-native-interface lptstr

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

2 个答案:

答案 0 :(得分:8)

LPTSTR有两种模式:

LPWSTR如果UNICODE已定义,则为LPSTR

#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文档,LPSTRtypedef的{​​{1}}:

char *

所以你可以试试这个:

typedef char* PSTR, *LPSTR;

答案 1 :(得分:0)

USES_CONVERSION和相关的宏是最简单的方法。为什么不使用它们?但您始终只需检查是否定义了UNICODE或_UNICODE宏。如果它们都没有定义,则不需要转换。如果定义了其中一个,则可以使用MultiByteToWideChar执行转换。

实际上,这是一件愚蠢的事情。 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

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