2013-02-04 59 views
4

我想將常量字符*轉換爲LPTSTR。但我不想使用USES_CONVERSION來執行此操作。從const char *轉換爲LPTSTR without USES_CONVERSTION

以下是我用來使用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.. 

回答

6

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文檔,LPSTRtypedefchar *的:

typedef char* PSTR, *LPSTR; 

所以喲你可以試試這個:

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

因爲我一直使用UNICODE,所以我直接通過LPWSTR,它工作正常.. –

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