2016-10-10 18 views
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*을 어떻게 읽을 수 있으며 무료로 제공 할 수 있습니까? 어떤 도움이라도 대단히 감사합니다!

+1

'Marshal.FreeCoTaskMem' 그러나 그것은'IntPtr' 매개 변수를 예상 'String' 인스턴스 대신에. 당신은'IntPtr'를 사용하기 위해'getLabel' 가져 오기를 변경할 수 있고 문자열 변환을 직접 할 수 있습니다. – Dai

+0

당신이 옳습니다. 나는 그것에 대해 생각하고 또한 그것을 시도했지만, 그런 식으로 나는 내용을 정확하게 읽을 수 없었다. 아마 내가 뭔가 잘못한 것 같아. 이제 그 시도로 그 질문을 편집합니다. – BugsFree

+0

해당 라이브러리가 다른 기능에서 생성 된 객체의 메모리를 정리하는 유틸리티 기능을 제공하는지 여부를 확인 했습니까? – Anzurio

답변

0

덕분에 @Dai 및 @IanAbbot 의견에 내가 완벽하게 작동하는 솔루션까지 왔어요 : 당신이 호출 할 필요가 생각

[DllImport("sibio_multilanguage_c.dll", EntryPoint = "getLabel", CallingConvention = CallingConvention.Cdecl)] 
private static extern UInt32 _getLabel([In] string i_formName, [In] string i_fieldName, 
             out IntPtr i_output); 

static public string getLabel(string i_formName, string i_fieldName) 
{ 
    IntPtr i_result; 
    string str = null; 
    UInt32 err = _getLabel(i_formName, i_fieldName, out i_result); 
    if (0 != err) 
    { 
     throw new System.IO.FileNotFoundException(); 
    } 
    str = Marshal.PtrToStringAuto(i_result); 
    Marshal.FreeCoTaskMem(i_result); 
    return str; 
}