// --------------------------- C# 코드 -------- ----------------------SysFreeString() 호출시 힙 손상 오류
[DllImport("MarshallStringsWin32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
extern static void PassStringOut([MarshalAs(UnmanagedType.BStr)] out String str);
[DllImport("MarshallStringsWin32.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
extern static void FreeString([MarshalAs(UnmanagedType.BStr)] String str);
static void Main(string[] args)
{
String str;
PassStringOut(out str);
FreeString(str);
}
// ------------------- -------- C + 코드 ------------------------------
void PassStringOut(__out BSTR* str)
{
const std::string stdStr = "The quick brown fox jumps over the lazy dog";
_bstr_t bstrStr = stdStr.c_str();
*str = bstrStr.copy();
}
void FreeString(BSTR str)
{
SysFreeString(str);
}
PassStringOut() 및 FreeString()에서 'str'포인터가 다르며 SysFreeString()을 호출 할 때 힙 손상 오류가 발생합니다. FreeString()에 대한 참조로 'str'을 전달해야합니까? 그렇다면 C# 및 C++에서 사용해야하는 구문은 무엇입니까?
문자열에 대해 2 개의 복사본이 생성됩니다. "* str = bstrStr.copy();" 그리고 마샬링 층에 의해? –
@Stephenosella : 원래 문자열로 만들어진 복사본이 4 개 있습니다. 이러한 복사본 중 세 개는 BSTR로, 한 개는 관리되는 String으로 변환됩니다. 마지막 복사본이 두 번 해제되어 힙이 손상됩니다. 자세한 내용은 내 대답을 참조하십시오. –