2010-12-07 8 views
0

ライブラリを使用していて、その機能の1つからstd::wstringを、_TCHAR []を送信する必要がある別のライブラリを送信しています。どうすれば変換できますか?std :: wstring _TCHAR []から変換するにはどうすればよいですか?

+0

他のライブラリは** const ** _TCHAR []を受け入れますか?つまり、データを変更する予定ですか?もしそうなら、**データを**延長することができますか? –

+0

はい、const _TCHAR []は大丈夫です。データを変更するつもりはありません。 – coolface

+1

_TCHARとは何ですか? _TCHARは、Unicodeビルドではwchar_tとして定義されますが、Unicode以外のビルドではcharとして定義されます。 –

答えて

2

あなたがUnicodeビルドを使用していると仮定すると、std :: wstring.c_str()が必要です。 c_str()は、返される文字列がヌルで終了することを保証します。

void func(const wchar_t str[]) 
{ 
} 

std::wstring src; 
func(src.c_str()); 

あなたは非Unicodeビルドを使用している場合は、WideCharToMultiByteを経由して非Unicode文字列にUnicode文字列を変換する必要があります。

0

@Zachはあなたはユニコードのためにのみビルドする場合は、std::wstring.c_str()で逃げることができ、言ったが、conteptually tstringstd::basic_string<TCHAR>typedef)を定義する方が良いだろうので、あなたが安全に、文字列のこの種を使用することができます見通り完全にWindowsとライブラリの機能を完全にTCHAR s と期待しています。

は、追加の楽しみのためにあなたはTCHARのためにも他のすべての文字列に関連するC++の機能を定義し、変換関数std::string/std::wstring < =>tstringを作成する必要があります。

幸いにも、この作業はすでに完了しています。 hereおよびhereを参照してください。


  1. 実際TCHAR sはコンパイル時にchar秒またはwchar_tのように解決されているので、何もコンパイルされたライブラリ関数は、本当に、TCHAR *を期待することはできませんが、あなたはアイデアを得ました。
+0

C++ライブラリは 'TCHAR *'を期待できます。結局のところ、C++は引数の型をオーバーロードしています。それは珍しいビルドですが、MSVCの名前のマングリングはそれを処理することができます。ほとんどのWin32 DLLもTCHARを期待していますが、名前のマングリングは "A/W"接尾辞マクロを介してセットアップされています。 – MSalters

+0

コンパイルされたC++ライブラリは本当に 'TCHAR *'を期待できません。二つの別々の(オーバーロードされた)関数を持ち、 'char *'を受け入れる関数と 'wchar_t *'を受け入れる関数です。 '_UNICODE'マクロです。それは私が自分の注釈で意図したものでした。 –

0

ATL and MFC String Conversion Macrosを使用してください。これは、_UNICODEでコンパイルするか、ANSIモードでコンパイルするかに関係なく機能します。

MFCを使用していない場合でも、これらのマクロを使用できます。この例に示す2つのATLヘッダーを含めてください:

#include <string> 

#include <Windows.h> 

#include <AtlBase.h> 
#include <AtlConv.h> 

int main() 
{ 
    std::wstring myString = L"Hello, World!"; 

    // Here is an ATL string conversion macro: 
    CW2T pszT(myString.c_str()); 

    // pszT is now an object which can be used anywhere a `const TCHAR*` 
    // is required. For example: 
    ::MessageBox(NULL, pszT, _T("Test MessageBox"), MB_OK); 

    return 0; 
} 
関連する問題