Vista到来。既存C/C++資産の.NET化を始めよう! - @ITと
C++/CLI Tips : 文字列操作のページを参考にしてヘッダーファイルを作ってみました。
//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;
}
};
- MultibyteStringToCLI - マルチバイト文字列をマネージ文字列に変換します。
- ToMultibyteString - マネージ文字列をマルチバイト文字列に変換します。
- WideStringToCLI - ワイド文字列をマネージ文字列に変換します。
- ToWideString - マネージ文字列をワイド文字列に変換します。
#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();
}