LCMapString を使ってダイレクトに文字列を変換する(C++/CLI 編)

昨日は VB で LCMapString を使うサンプルを書いてみたわけですが、何気に C++/CLI にもチャレンジしてみたくなりました。で、できたのがこれ。

#include "stdafx.h"
#include "windows.h"
#include "vcclr.h"

using namespace System;


// 文字列を現在のロケールで変換
System::String^ MapString(System::String^ source, int mapFlags) { 

	if (String::IsNullOrEmpty(source)) {
            throw gcnew ArgumentException(L"空文字は処理できません。", "source");
	}

	pin_ptr<const wchar_t> src = PtrToStringChars(source);
	array<wchar_t>^  buffer = gcnew array<wchar_t>(source->Length + 1);
	pin_ptr<wchar_t> dest = &buffer[0];

	::LCMapString(::GetUserDefaultLCID(), mapFlags, src, -1, dest, buffer->Length);

	return gcnew String(dest);
}


int main(array<System::String ^> ^args)
{
	Console::WriteLine(L"コンピューター → " + MapString(L"コンピューター", LCMAP_HIRAGANA));
	Console::WriteLine(L"こんぴゅーたー → " + MapString(L"こんぴゅーたー", LCMAP_KATAKANA));
	Console::ReadKey();
	return 0;
}

結果

コンピューター → こんぴゅーたー
こんぴゅーたー → コンピューター


書いててつくづく思ったのですが、C++/CLI ってホントに C++ と別言語ですね。よほど特殊な案件でなければ、C++/CLI を実戦で使う機会はなさそうです。もし実戦で使うならネイティブアプリとマネージ DLL の仲介役とかが一番役立つかもしれませんね。