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

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

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

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

Q&A

解決済

2回答

14070閲覧

System::Stringをstd::stringに変換する場合

masa7609

総合スコア8

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

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

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

0グッド

0クリップ

投稿2017/08/18 10:10

System::Stringをstd::stringに変換する場合にMarshal::StringToHGlobalAnsiに ANSI (1 バイト) 文字として Unicode 文字列をアンマネージ メモリにコピーする際に未定義の値となりコピーができなく困っております。

どなたかお力を貸していただけますでしょうか。

イメージ説明

C++

1// System::String を標準文字列に変換 2 static std::string systemStringToStdString(System::String ^ s) { 3 using namespace System::Runtime::InteropServices; 4 5 IntPtr hString = Marshal::StringToHGlobalAnsi(s); 6 std::string rtnSts = (const char *)hString.ToPointer(); 7 Marshal::FreeHGlobal(hString); 8 return rtnSts; 9 } 10

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

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

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

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

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

guest

回答2

0

ベストアンサー

C++/CLIはここしばらくやっていないので固有の書き方はだいぶ忘れてしまっていますが、マネージ文字列(用語合っているか自信なし)と標準C++の文字列との相互変換は、確かヘッダーをインクルードするだけで簡単にできたはずだと思い調べ直したら、やはり簡単にできますね。わざわざメモリコピーなどの手順を踏む必要はありません。

C++

1#include <msclr/marshal_cppstd.h> 2 3System::String ^ s = gcnew System::String(L"文字列"); 4 5// マネージ文字列をstd::stringに変換 6std::string str = msclr::interop::marshal_as<std::string>(s); 7 8// マネージ文字列をstd::wstringに変換 9std::wstring wstr = msclr::interop::marshal_as<std::wstring>(s);

ほかにも「C++ におけるマーシャリングの概要」にどのような変換ができるか書かれています。

投稿2017/08/18 12:16

catsforepaw

総合スコア5938

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

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

masa7609

2017/09/05 04:40

ご回答ありがとうございました。 提示してくださりました方法で解決いたしました。
guest

0

こんにちは。

方法: System::String を標準文字列に変換すると目視で見比べる限り、同等なプログラムになっているように見えます。(微細差はあります。)

その関数から戻った時の戻り値をMessageBox等で表示してみたらどうなるでしょうか?
古いですが、こんな情報もあったのでIDEが嘘の報告をしている可能性も多少あると思います。

実際の戻り値も可笑しいのであれは、マイクロソフトのサンプル・コードとの微細差の影響があるのかも知れません。まずはマイクロソフトのサンプルでトライしてみると良いと思います。

投稿2017/08/18 10:53

Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問