輝々凛々

ガンバるってことは、素晴らしい事だ。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ツッコミの投稿


(ツッコミ非公開の場合はチェック)

System::Stringをchar*に変換したいっ

以下の内容は、redstrange wiki「.NET Framework 文字列操作」で書いたものです

マネージドからアンマネージド文字列へ変換

マネージド文字列(System.String)からアンマネージド文字列(unsigned char*)へ 変換するのは面倒なものです。ここでは、System.Stringで与えられた文字列を C言語の文字列に変換する手法を2つ紹介します。
(「マネージからアンマネージ文字列」と書いているにも関わらず、2つめの手法は結局マネージ文字列です。  ま、目的は達成できているから、良しとしよう。)

Web上でよく紹介されている方法

using namespace System::Runtime::InteropServices; void * unmanagedChars = (Marshal::StringToHGlobalAnsi(managedString)).ToPointer(); printf("%s\n", unmanagedChars); // 解放 Marshal::FreeHGlobal(unmanagedChars);

取得した文字列のためのメモリ領域を解放しないとメモリリークします(たぶん)。
「void *」にしていますが、「char *」にキャストすると良いかと思います。
今回は、printfでの表示でしたのでキャストする手間を考え「void *」としました。

あまり紹介されていない方法

メモリリークを絶対的に阻止したい→できるだけマネージドから離れたくない人
あるいは、メモリ管理を放棄したい人向け。

unsigned char managedChars __gc[] = System::Text::Encoding::Convert( System::Text::Encoding::Unicode, System::Text::Encoding::GetEncoding("Shift_JIS"), // 環境依存 System::Text::Encoding::Unicode->GetBytes(managedString) ); printf("%s\n", managedChars); // 標準関数ならそのまま使える?! char str[65536]; // サイズは、目的に合わせてください。 sprintf(str, "%s", managedChars); function(str); // 自前の関数は、sprintfで変換!

環境に合わせて、エンコーディングを変えないとダメだけど、
メモリリークはシステム任せにできる。
エンコーディングの指定は、System::Text::Encoding::GetEncoding(0)でいいのかも。
0を与えると既定のエンコーディングが使われるそうだから。
(→http://msdn2.microsoft.com/ja-jp/library/wzsz3bk3.aspx

あ、VC2005の場合は、sprintfじゃなくて「sprintf_s」を使おうね

関連記事

ツッコミの投稿


(ツッコミ非公開の場合はチェック)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。