3) String^을 C/C++ 문자열로 변환
1)번에서는 C/C++의 문자열을 String^로 변환하는 방법에 대해서 설명했습니다.
이번에는 String^을 char*나
wchr_t*로 변환하는 방법에 대해서 설명합니다.
아래의 예제 코드를 봐 주세요
#include
<string>
#include
<msclr\marshal_cppstd.h>
using
namespace System;
using
namespace msclr::interop;
int main()
{
System::String^ s0 = L"비주얼스튜디오2010 팀블로그";
// 방법 1
std::string tmp =
marshal_as<std::string>(s0);
const char* s1 = tmp.c_str();
std::cout << "String^
-> string : " << s1 << std::endl;
// 방법 2
const char* s2;
const wchar_t* s3;
{
marshal_context ctx;
s2 =
ctx.marshal_as<const char*>(s0);
s3 =
ctx.marshal_as<const wchar_t*>(s0);
std::cout <<
"String^ -> char* : " << s2 << std::endl;
setlocale(LC_ALL,
"");
std::wcout <<
"String^ -> wchar_t : " << s3 << std::endl;
}
getchar();
return 0;
}
String^을 char*나
wchr_t*로 변환하는 방법은 두 가지가 있습니다.
첫 번째
std::string 사용
가장 간단한 방법입니다만 불필요한 std::string을 사용해야 단점이 있습니다.
std::string
tmp = marshal_as<std::string>(s0);
const char*
s1 = tmp.c_str();
std::cout
<< "String^ -> string : " << s1 << std::endl;
두 번째 marshal_context
사용
첫 번째 방법에서 std::string을 사용한 이유는 다름이 아니고 메모리 확보 때문입니다.
마샬링을 통해서 char*와 wchar_t*에 메모리 주소를 저장합니다. 문자열 그 자체를 복사하는 것이 아닙니다. 그래서 변환한 문자열을
저장할 메모리 주소를 확보하고 사용 후에는 해제를 해야 합니다. 메모리 확보와 해제를 위해서 marshal_context를 사용합니다.
marshal_context는 변환에 필요한 메모리를 확보하고, 스코프를 벗어날
때 메모리를 해제합니다.
const char*
s2;
const
wchar_t* s3;
{
marshal_context ctx;
s2 = ctx.marshal_as<const
char*>(s0);
s3 = ctx.marshal_as<const
wchar_t*>(s0);
}
String^을 C/C++ 문자열로 변환할 때는 std::string + marshal_as 나 marshal_context 둘
중 하나를 선택하여 사용합니다.
http://msdn.microsoft.com/ko-kr/library/bb531313%28VS.90%29.aspx
'C++/CLI' 카테고리의 다른 글
[Step. 08] 프로퍼티 ( property ) (8) | 2010.08.06 |
---|---|
[Step. 07] 비관리 클래스에서 관리 클래스를 멤버로, 관리 클래스에서 비관리 클래스를 멤버로 (0) | 2010.07.30 |
[Step. 06-1] 관리코드의 문자열과 비관리코드의 문자열 변환 (0) | 2010.07.16 |
[Step. 05] 관리 코드의 array를 비관리 코드에 포인터로 전달 (0) | 2010.07.09 |
[Step. 04] nullptr, interior_ptr, pin_ptr (2) | 2010.06.25 |