2017-01-20 9 views
0

나는 약간 의 char * Bar[]을 얻는 것을 혼동했다.관리되는 배열에서 char * arr []을 얻는 방법 <String^> ^?

내 관리되지 않는 함수 모양이 좀있다 : 부 관리

void NativeClass::Foo(char * Bar[]) 
{ 
    SomeAPIFunction(Bar); 
} 

은 (단지 내가 달성하기 위해 노력하고있는 무슨의 아이디어를 줄 것이다) :

void ManagedClass::Foo(array<String^>^ Bar) 
{ 
    NativeClass * MyNativeClass = new NativeClass(); 
    MyNativeClass->Foo(Bar); 
} 
  • pin_ptr 발견. 그것을 작동시킬 수 없습니다.
  • String^ ~ char *의 경우 : char * NewFoo = (char*)(void*)Marshal::StringToHGlobalAnsi(Foo);을 사용하십시오. 그런 식으로 갈 수있는 기회가 있을지 모릅니다.
  • SomeAPIFunction(Bar)을 변경할 수 없습니다.
  • 내 관리 Bar의 크기가 고정되어 있지 않습니다.
+1

'String :: c_str()'을 사용하지 않는 이유는 무엇입니까? – Stargateur

+0

'String ^'에서'char * '를 얻는 법을 알았습니다. 좋은 시작입니다. 예를 들어 'std :: vector ''배열 ^'에서? 당신이 그것을 할 수 있다면 당신은 실질적으로 당신이 필요로하는 것을 가지고 있습니다. 오, 그런데, 왜 당신은 동적으로'MyNativeClass'를 할당하고 있습니까? 마지막으로, 생성하는 문자열을 해제하는 것을 잊지 마십시오! –

+0

나는 여전히 그것에 대해,하지만 명확히하기 위해, "관리되는 부분"예제는 단지 참조 용이며, 나는'MyNativeClass'를 초기화해야합니다. 그리고 저는 "수동 GC"도하고 있습니다. 하지만 내 문제는이게 관련이 없다고 생각해. 그래서, 갈 가장 좋은 방법은 뭔가? 'array ^'을'char * Bar []'의'벡터 '에 연결 하시겠습니까? – Essigwurst

답변

2

단일 문자열을 변환하는 유틸리티 방법이 있지만 배열의 경우 직접해야합니다.

이것은 내가 할 수있는 것입니다. 첫째, C++ 클래스로 변환하십시오. 편리하고 대부분의 메모리 할당을 처리해야하기 때문입니다. 그런 다음 char*[]을 만들어 C++ 객체를 가리 킵니다.

void ManagedClass::Foo(array<String^>^ managedArray) 
{ 
    std::vector<std::string> vec; 
    for each (String^ managedStr in managedArray) 
     vec.push_back(marshal_as<std::string>(managedStr)); 

    char** unmanagedArray = new char*[vec.size()]; 
    for (size_t i = 0; i < vec.size(); i++) 
     unmanagedArray[i] = vec[i].c_str(); 

    NativeClass * MyNativeClass = new NativeClass(); 
    MyNativeClass->Foo(unmanagedArray); 

    delete[] unmanagedArray; 
} 

면책 조항 : 나는 순간 컴파일러에서 아니에요, 사소한 구문 오류가있을 수 있습니다.

+0

이 예제를 이용해 주셔서 감사합니다. unmanagedArray [i] = (char *) vec [i] .c_str();'NativeClass :: Foo (char * Bar [])'를 NativeClass :: Foo (char ** Bar) 그것을 작동하게했습니다. – Essigwurst