C++/CLIでC言語のprintf関数を呼び出す。

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

C++/CLIでC言語のprintf関数を呼び出す。

投稿記事 by naohiro19 » 11年前

.NET Frameworkでは文字列をユニコードとして扱うので System.Stringとwchar_t*/char*への相互変換が必要になっていきます。
C++では stringクラスとwstringクラスの2種類が標準で組み込まれています。この2種類を使って相互変換をします。
また、System.Runtime.InteropServices名前空間のMarshalクラスも使います。

CODE:


std::string mbStr = "マルチバイト文字列";
std::string ucStr = L"ユニコード文字列";

//char*をString^に変換
String^ ret = gcnew String(mbStr.data(), 0, mbStr.length);

//wchar_t*をString^に変換
String^ ret = gcnew String(ucStr,data(), 0, ucStr.length);

//String^をchar*に変換
String^ text = "ドットネット文字列";
IntPtr mptr = Marshal::StringToHGlobalAnsi(text);
std::string ret = static_cast(mptr.ToPointer());
Marshal::FreeHGlobal(mptr);

//String^をwchar_t*に変換
String^ text = "ドットネット文字列";
IntPtr mptr = Marshal::StringToHGlobalUni(text);
std::wstring ret = static_cast(mptr.ToPointer());
Marshal::FreeHGlobal(mptr);
というようにする必要があります。

CODE:

#using 

#include 
#include 
using namespace System;
using namespace System::Runtime::InteropServices;

public ref class PrintTest
{
public:
	static void ShowMsg(String^ msg)
	{
		IntPtr mptr = Mashal::StringToHGlobal(msg);
		std::string ret = static_cast(mptr.ToPointer());
		printf("%s\n", ret.c_str() );
                Marshal::FreeHGlobal(mptr);
	}
};

int main(array^ args)
{
	String^ text = gcnew String("こんにちは");
	PrintTest::ShowMsg(text);
	return 0;
}
最後に編集したユーザー naohiro19 on 2014年4月20日(日) 16:33 [ 編集 3 回目 ]

YuO
記事: 947
登録日時: 14年前

Re: C++/CLIでC言語のprintf関数を呼び出す。

投稿記事 by YuO » 11年前

marshal_as関数,marshal_context::marshal_as関数を使いましょう。
ref) http://msdn.microsoft.com/ja-jp/library/bb384865.aspx

まぁ,managedの世界で完結できるならばmanagedの世界で完結させるべきだとは思いますが。

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

Re: C++/CLIでC言語のprintf関数を呼び出す。

投稿記事 by naohiro19 » 11年前

Visual Studio 2005しかもっていない人は日記通りのプログラムになっちゃいますよ