Задать вопрос

Как получить строку из native кода в managed через агрумент char**?

Делаю обертку на C# для библиотеки на C. Одна из функций должна возвращать строку через аргумент, примерно так:

int some_func(char** str)
{
    if (str) *str = ...;
    return 123;
}


То есть, как мне кажется, надо передать в функцию что-то вроде "out IntPtr", а по возвращении копировать оттуда строку. Но не работает - получаю ошибку "An invalid VARIANT was detected during a conversion from an unmanaged VARIANT to a managed object."
  • Вопрос задан
  • 68 просмотров
Подписаться 1 Сложный 2 комментария
Решения вопроса 1
Kalobok
@Kalobok Автор вопроса
Всем спасибо, все свободны. Проблема была в другом месте. На всякий случай, вот такой код, похоже, работает.

[DllImport("some_lib.dll", EntryPoint = "some_func", ...)]
private static extern int x_SomeFunc(ref IntPtr str);

public static int SomeFunc(out string str)
{
    IntPtr ptr = IntPtr.Zero;
    int ret = x_SomeFunc(ref ptr);
    // lstrlenA() нужно импортировать из kernel32. Или использовать что-то еще для вычисления размера буфера.
    int size = lstrlenA(ptr);
    byte[] bytes = new byte[size];
    Marshal.Copy(ptr, bytes, 0, size);
    str = Encoding.UTF8.GetString(bytes); // UTF8 - это в моем случае
    // освободить память, если строка была создана динамически
    ...
    return ret;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы