четверг, 1 ноября 2012 г.

Как вернуть строку из unamanaged кода C#.

Предположим есть С++'овская функция возвращающая std::string. Квест : вызвать эту функцию из С# так чтобы это все работало и не падало. Делать так:

const char* __stdcall функцияОберткаС++( ... )
{

    const std::string ret_str = функцияС++API( ... );

    char* pszReturn = NULL;

    // Это заклинание тут необходимо, обычный С++ new не работает (ошибка)
    pszReturn = (char*)::CoTaskMemAlloc( ret_str.length() + 1 );
    strcpy(pszReturn, ret_str.c_str());
    return pszReturn;
}

В C# делаем описываем интерфейс:

[DllImport("библиотека.dll", CharSet = CharSet.None)]
[return: MarshalAs(UnmanagedType.LPStr)]     
public static extern string функцияОберткаС++( ... );

Вот так вроде работает.