현재 Visual Studio 2010을 사용 중입니다. C++ 클래스의 래퍼를 작성한 것은 이번이 처음입니다. C++의 클래스는 다음과 같습니다 : I 보이는 헤더 파일을 생성 C#의 String []을 C++의 Char * []로 변환
bool exampleCode(char* arrayOfStrings[], int number, char* regularString)
같은 :
bool exampleCode(array<String^>^ arrayOfStrings, int number, String^ regularString)
과 같은 .cpp 파일 클래스는 같습니다 내가 알아 낸
bool exampleCode(array<String^>^ arrayOfStrings, int number, System::String^ regularString)
regularString 데이터를 마샬링하는 방법은 있지만 String
배열을 char*[]
으로 변환하는 방법을 잘 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다.
#include <algorithm>
#include <memory>
#include <vector>
using System::IntPtr;
using System::String;
using System::Runtime::InteropServices::Marshal;
bool exampleCodeManaged(array<String^>^ arrayOfStrings, String^ regularString)
{
auto deleter = [](char* p) { Marshal::FreeHGlobal(IntPtr(p)); };
typedef std::unique_ptr<char[], decltype(deleter)> cstr_t;
auto make_cstr = [&deleter](String^ s)
{
return cstr_t(
static_cast<char*>(Marshal::StringToHGlobalAnsi(s).ToPointer()),
deleter
);
};
std::vector<cstr_t> cstrs;
cstrs.reserve(arrayOfStrings->Length);
for each (String^ s in arrayOfStrings)
cstrs.push_back(make_cstr(s));
std::vector<char*> ptrs;
ptrs.reserve(cstrs.size());
std::for_each(
cstrs.begin(),
cstrs.end(),
[&ptrs](cstr_t& cstr) { ptrs.push_back(cstr.get()); }
);
auto reg_cstr = make_cstr(regularString);
return exampleCode(ptrs.data(), arrayOfStrings->Length, reg_cstr.get());
}
(이 배열의에서 추론 할 수 number
가 관리 기능에 전달 될 필요가 없다는 것을 참고 : 다음
네이티브 함수는 전달 된 메모리를 정리합니까? 아니면 호출자에게 남겨 둡니까? – ildjarn
나는 네이티브 함수가 통과 한 메모리를 정리한다고 믿지만, C++/CLI 프로그래밍이 처음 인 이래로 나는 100 %가 아니다. – avtoader
좋아, 그럼 다음 질문은 _how_ 네이티브 함수는 메모리를 정리합니까? '자유'? 'delete []'? 'CoTaskMemFree'? 'LocalFree'? 'GlobalFree'? – ildjarn