質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

14180閲覧

std::string型からLPCTSTR(またはwchar *)型への変換を行いたい

notgoodpg

総合スコア37

MFC

MFC (Microsoft Fouondation Class)とは、MicrosoftがVC++用に開発したWindows用アプリケーションのフレームワークです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/11/02 05:24

編集2018/01/23 00:12

###前提・実現したいこと

VisualStudio2008 SP1のMFCアプリケーションでEditBoxに文字列を表示したい。
そのためにstd::string型の文字列をwchar *型に変換する必要があるようなのでこれを実現したい。
よろしくお願いいたします。

###発生している問題・エラーメッセージ
型変換が実現できない。

###該当のソースコード

c++

1 Hoge hoge = new Hoge("foo"); 2 string msg = hoge->getMessage(); 3 GetDlgItem(IDC_EDIT1)->SetWindowTextW(msg); 4 5 //IDC_EDIT1のEditBoxにfooと表示したい。

*Hogeはclassで、コンストラクタでメンバにstd::string型文字列を持たせてgetMessage()関数でstd::string型文字列を取り出します。
*IDC_EDIT1はEditBoxのIDです。

実際のコードとは異なりますが上コードのようなコードを実現したいと考えています。

###試したこと
LPCTSTR型にキャストし、文字化けしました。
[MSDNに載っていた方法](https://msdn.microsoft.com/ja-jp/library/ms235631.aspx#System::String からの変換)はpin_ptr : 定義されていない識別子です。とエラーが出て対処できずにいます。

###補足情報(言語/FW/ツール等のバージョンなど)

  • VisualStudio2008 SP1
  • C++ / MFC
  • Windows7 Professional SP1 64bit
  • プロジェクトプロパティページ > 構成プロパティ > 文字セット > Unicode文字セットを使用する

ベストアンサーには問題を解決できる内容の回答を最初に提示していただいた方を選択しています。

###ちなみに、LPCTSTR->std::stringしたい場合も多いですね!
こうしてます
超絶めんどくさいです
1行、20文字くらいで終わるいい方法知ってたら教えてください

c++

1// TCHAR -> char 2std::string MyCommon::TCHARArrayToString( TCHAR *src) 3{ 4 std::vector<char> rtnValue; 5#ifdef UNICODE 6 // デフォルトでUNICODEが選択されてるのに何でしょうこのめんどくささは。 7 // TCHAR -> char 8 char tcb[ MAX_PATH]; 9 WideCharToMultiByte( CP_ACP, 0, src, -1, tcb, sizeof(tcb), NULL, NULL); 10 11 for(int i = 0; tcb[i] != '\0'; ++i) rtnValue.push_back( tcb[i]); 12#else 13 14 for(int i = 0; tcb[i] != '\0'; ++i) rtnValue.push_back( src[i]); 15#endif 16 std::string s( rtnValue.begin(), rtnValue.end()); 17 18 return s; 19}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

そもそも、Unicode文字列を入れるのはstd::wstringで、std::stringの役割ではありません。

あと、MFCと組み合わせるのであれば、stdの文字列型を使うよりCStringのほうが適切ではないかと思います。CString::operator LPCTSTRもあるので、LPCTSTRにはそのまま渡せます。

投稿2017/11/02 05:34

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

notgoodpg

2017/11/02 06:29

ご回答いただきありがとうございました。 str::string型で処理していたものをCString型に置き換えて対応しました。
episteme

2018/01/22 10:29

あたしゃ #ifdef UNICODE typedef std::wstring tstring; #else typedef std::string tstring; #endif んでもって tstring 使う。 # もはやMFCとか使う機会もないけど
guest

0

C++

1#include <tchar.h> 2#include <string> 3#include <iostream> 4#include <windows.h> 5 6std::string TCHARArrayToString( const TCHAR *src) { 7#ifdef UNICODE 8 std::string result(wcslen(src)*2+1,'\0'); 9 size_t len = WideCharToMultiByte( CP_ACP, 0, src, -1, &result[0], result.size(), NULL, NULL); 10 result.erase(len); 11 return result; 12#else 13 return src; 14#endif 15} 16 17// おためし 18int main(void) { 19#ifdef UNICODE 20 const TCHAR* src = L"alphabetかな漢字"; 21#else 22 const TCHAR* src = "alphabetかな漢字"; 23#endif 24 std::cout << TCHARArrayToString(src) << std::endl; 25}

投稿2018/01/22 10:17

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

notgoodpg

2018/01/23 00:31

ご回答ありがとうございます。 見比べてみると私のほうには明らかに無駄な記述が多いですね。参考にして改善いたします。
guest

0

単なるキャストではだめで、ワイド(UNICODE)文字列を生成して渡す必要があります。
MultiByteToWideCharを使ってもよいのですが、CString(T)にてマルチバイト/UNICODE両対応の文字列を生成するのが楽です。

参考:CStringAからCStringに変換する方法およびその逆のCStringからCStringAに変換する方法

また、プロジェクト設定にて文字コード切替ることを考慮するとSetWindowTextW(決めうちではなくSetWindowText(を利用したほうがよいでしょう。

C++

1std::string msg = "hoge"; 2CString s(msg.c_str()); 3GetDlgItem(IDC_BUTTON1)->SetWindowText(s);

投稿2017/11/02 06:09

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

notgoodpg

2017/11/02 07:04

ご回答いただきありがとうございます。 `SetWindowText()`関数を用いるように変更する対応も行いました。 MultiByteToWideCharの方法について試してみましたが、アクセス違反が発生して対処方法がわからないため断念してCString型に変更する対応を行いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問