2
나는 C에서 DLL에이 기능을하고 난 변경할 수 없습니다 :wchar_t **를 C++에서 out 매개 변수로 C#으로 마샬링 하시겠습니까?
extern "C" SIBIO_MULTILANGUAGE_API_C DWORD getLabel(const char* const i_formName,
const char* const i_fieldName,
wchar_t** i_output);
나는이 호출이 내부의 기능 CoTaskMemAlloc
를 사용하여 wchar_t*
에 대한 메모리를 할당하는 것을 알고있다. 나는 C 함수에 할당 된 메모리를 올바르게 wchar_t*
의 내용을 읽을 수 있지만 이런 식으로 읽는 것은 내가 해제하지 않을 수 있어요
[DllImport("sibio_multilanguage_c.dll", EntryPoint = "getLabel", CallingConvention = CallingConvention.Cdecl)]
private static extern UInt32 _getLabel([In] string i_formName, [In] string i_fieldName,
[MarshalAs(UnmanagedType.LPWStr)] out string i_output);
static public string getLabel(string i_formName, string i_fieldName)
{
string str = null;
UInt32 err = _getLabel(i_formName, i_fieldName, out str);
if (0 != err)
{
throw new System.IO.FileNotFoundException();
}
return str;
}
: C#에서
나는이 방법으로이 기능을 포장 .
wchar_t*
을 어떻게 읽을 수 있으며 무료로 제공 할 수 있습니까? 어떤 도움이라도 대단히 감사합니다!
'Marshal.FreeCoTaskMem' 그러나 그것은'IntPtr' 매개 변수를 예상 'String' 인스턴스 대신에. 당신은'IntPtr'를 사용하기 위해'getLabel' 가져 오기를 변경할 수 있고 문자열 변환을 직접 할 수 있습니다. – Dai
당신이 옳습니다. 나는 그것에 대해 생각하고 또한 그것을 시도했지만, 그런 식으로 나는 내용을 정확하게 읽을 수 없었다. 아마 내가 뭔가 잘못한 것 같아. 이제 그 시도로 그 질문을 편집합니다. – BugsFree
해당 라이브러리가 다른 기능에서 생성 된 객체의 메모리를 정리하는 유틸리티 기능을 제공하는지 여부를 확인 했습니까? – Anzurio