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次の 2 つのモードがあります。

LPWSTRifUNICODEが定義されているか、 LPSTRotherwise が定義されています。

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

または別の方法で:

LPTSTR is wchar_t* or char* depending on _UNICODE

あなたLPTSTRが非ユニコードの場合:

MSDN の完全な MS-DTYP IDLドキュメントによるLPSTRと、次typedefのいずれかですchar *

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 に答える