2012-03-20 49 views
0

Visual Studio 2010 MFCを使用してC++プログラムをビルドしています。私のプログラムは、プロジェクトの一部ではなく、char *を受け付けるDLLを呼び出します。私はLPCTSTRの形式で文字列を取得する関数を持っています。私は約2時間はGoogle上でされており、解決策は見つかりませんでした。フォームをMFC LPCTSTRからchar *に変換するにはどうすればいいですか?私が見つけたものは、うまく動作しないか、コンパイルされません。 MFCでC++ LPCTSTR to char *

+3

プロジェクトでunicodeを使用していますか? – Torsten

答えて

3

最も簡単には(結果のバッファが読み取り専用引数であろうことを条件とする)CStringA介して変換することである。

LPCTSTR pszA = ... 
CStringA sB(pszA); 
const char* pszC = sB; 
char* pszD = const_cast<char*>(pszC); 

他のオプションが利用可能であり、議論された:

+0

'CString'は避けられない限り、これを使用しないでください。 – Puppy

+0

CStringに何か問題はありません。 ATL(MFCなし)でも動作します。 – selbie

+1

MFCでは 'CString'は「ネイティブ」の文字列ホルダクラスであり、完全に機能します。 'std :: string'も良いし、最近では標準ライブラリの一部であるという利点があります。この質問は、明らかにMFCです。 –

0

LPCTSTRconst wchar_t *またはプロジェクトがプリプロセッサシンボルにUNICODEを定義したかどうかに応じてconst char *のように定義されるか(または_UNICODE、私は1つのMFCが使用することを忘れ)。

したがって、問題の解決方法は、UNICODE設定を使用しているかどうかによって異なります。

使用している場合は、文字列を文字列に変換する必要があります。これを行うにはCStringAを使用してください。

UNICODEを使用していない場合は、変更可能なコピーを作成し、文字列を変更したい場合に備えてDLLに渡す必要があります。これを行うには、CStringを使用してコピーを作成します。

どちらの場合でも、CStringオブジェクトにコピーを作成した後は、GetBufferメソッドを使用して文字列への変更可能なポインタを取得し、DLL関数を呼び出して、呼び出し後にReleaseBufferを呼び出します。

+0

CStringを避けて使用しないでください。コピーを作成するには 'std :: string'を使います。 – Puppy

+2

@DeadMG回避できる場合は、MFCを使用しないでください。そして 'std :: string'から' char * 'をどうやって得るのですか? MFCの世界でプレイするときにMFCクラスを使用することには何も問題ありません。 – Praetorian