C++/CLI에서 char*와 System::String을 변환하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/56561

  •  09-06-2019
  •  | 
  •  

문제

char*에서 System::string으로 변환했다가 다시 C++/CLI로 변환하는 승인된 방법은 무엇입니까?Google에서 marshal_to<> 템플릿 함수에 대한 몇 가지 참조를 찾았지만 이 기능은 Visual Studio 2005에 적합하지 않은 것으로 보입니다(그리고 Visual Studio 2008 AFAIK에도 없습니다).나는 또한 몇 가지 코드를 보았습니다. 스탠 리프먼의 블로그, 하지만 2004년부터입니다.나는 또한 Marshal::StringToHGlobalAnsi()를 보았습니다."모범 사례"로 간주되는 방법이 있습니까?

도움이 되었습니까?

해결책

여기에 좋은 개요가 있습니다(VS2008에 추가된 마샬링 지원).http://www.codeproject.com/KB/mcpp/OrcasMarshalAs.aspx

다른 팁

System::String에는 char*를 사용하는 생성자가 있습니다.

 using namespace system;
 const char* charstr = "Hello, world!";
 String^ clistr = gcnew String(charstr);
 Console::WriteLine(clistr);

char*를 다시 가져오는 것은 조금 어렵지만 그리 나쁘지는 않습니다.

 IntPtr p = Marshal::StringToHGlobalAnsi(clistr);
 char *pNewCharStr = static_cast<char*>(p.ToPointer());
 cout << pNewCharStr << endl;
 Marshal::FreeHGlobal(p);

우리가 한 일은 관리되지 않은 코드의 문자열을 보유하고 항목의 관리된 복사본을 제공하는 C++\CLI 개체를 만드는 것입니다.변환 코드는 Stan이 그의 블로그에 있는 것과 매우 유사해 보입니다(정확하게 기억할 수는 없습니다)(그의 코드를 사용하는 경우 delete[]를 사용하도록 업데이트하십시오). 그러나 우리는 소멸자가 모든 릴리스를 처리하도록 했습니다. 개체의 관리되지 않은 요소.이것은 약간 과장되었지만 레거시 C++ 코드 모듈에 연결할 때 누출이 없었습니다.

몇 가지 도우미 메서드를 만들었습니다.이전 Qt 라이브러리에서 CLI 문자열로 이동하려면 이 작업을 수행해야 했습니다.누구든지 여기에 추가하여 메모리 누수가 있는 것 같고 이를 해결하기 위해 무엇을 할 수 있는지 알려주시면 매우 감사하겠습니다.

void MarshalString (  String ^ s, wstring& os ) {
    using namespace Runtime::InteropServices;
    const wchar_t* char = (const wchar_t*)(Marshal::StringToHGlobalUni(s)).ToPointer();
    os = char;
}
QString SystemStringToQt( System::String^ str)
{
    wstring t;
    MarshalString(str, t);
    QString r = QString::fromUcs2((const ushort*)t.c_str());
    return r;
}

가능한 방법 요약에 대한 추가 링크:

http://support.microsoft.com/?kbid=311259

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top