C++/CLI で System::String ⇔ std::string(std::wstring)の相互変換ファイル

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

C++/CLI で System::String ⇔ std::string(std::wstring)の相互変換ファイル

投稿記事 by naohiro19 » 13年前

この日記にはもう一つのブログに同じ内容のプログラムを載せてあります(消しました)

Vista到来。既存C/C++資産の.NET化を始めよう! - @IT
C++/CLI Tips : 文字列操作のページを参考にしてヘッダーファイルを作ってみました。

CODE:

//ConvString.h
#pragma once

#using 

using namespace System;
using namespace System::Text;

#include 

public ref class ConvertCLIString
{
public:

	static String^ MultibyteStringToCLI(std::string& input, Encoding^ encoding)
	{
		return gcnew String(input.data(), 0, input.size(), encoding);
	}


	static std::string ToMultibyteString(String^ input, Encoding^ encoding)
	{
		std::string result;
		if( input != nullptr && input->Length > 0)
		{
			array^ barray = 
				Encoding::Convert(Encoding::Unicode, encoding, 
				Encoding::Unicode->GetBytes(input));
			pin_ptr pin = &barray[0];
			result.assign(reinterpret_cast(pin), barray->Length);
		}
		return result;
	}


	static String^ WideStringToCLI(std::wstring& input)
	{
		return gcnew String(input.c_str());
	}

	static std::wstring ToWideString(String^ input)
	{
		std::wstring result;
		if( input != nullptr && input->Length > 0 )
		{
			array^ warr = input->ToCharArray();
			pin_ptr pin = &warr[0];
			result.assign(pin, input->Length);
		}
		return result;
	}
};
ConvertCLIStringクラスはマネージ文字列とアンマネージ文字列のやり取りに使うためのクラスです(すべて静的メソッド)。
  • MultibyteStringToCLI - マルチバイト文字列をマネージ文字列に変換します。
  • ToMultibyteString - マネージ文字列をマルチバイト文字列に変換します。
  • WideStringToCLI - ワイド文字列をマネージ文字列に変換します。
  • ToWideString - マネージ文字列をワイド文字列に変換します。
サンプルプログラム:

CODE:

#include "ConvString.h"
#include 

#pragma unmanaged

const char* greet(const char* name)
{
	static char result[128];
	strcpy_s(result, 128, name);
	strcat_s(result, 128, "さん、こんにちは");
	return result;
}

#pragma managed
public ref class GreetLib
{
public:
	static String^ Greet(String^ name)
	{
		//shift_jisのエンコードを取得
		Encoding^ sjis = Encoding::GetEncoding("shift_jis");
		//マネージ文字列をマルチバイト文字列に変換
		std::string input = ConvertCLIString::ToMultibyteString(name, sjis);
		//C関数の呼び出し
		std::string result = greet(input.c_str() );
		//マルチバイト文字列をマネージ文字列に変換して文字列を返す
		return ConvertCLIString::MultibyteStringToCLI(result, sjis);
	}
};

int main(array^ args)
{
	//GreetLibクラスのGreetメソッドを呼ぶ。
	Console::WriteLine("{0}", GreetLib::Greet("プログラマ"));
	Console::ReadKey();
}
最後に編集したユーザー naohiro19 on 2013年11月11日(月) 14:28 [ 編集 6 回目 ]

コメントはまだありません。