C # получает значение string / characters из функции c , которая возвращает указатель на символ

#c# #c #marshalling #char-pointer

#c# #c #сортировка #указатель на символ

Вопрос:

У меня есть DLL, написанная на C . Функция этой DLL похожа на следующий код:

Код на C :

      char _H *GetPalette() {

            -------Functions body

            -------Functions body

            return pPaletteString;

      }
  

Теперь я хочу получить строку поддона из этой функции GetPalette() в коде C #.

Как я мог бы получить строку из этой функции? Я пробовал это в коде C #. Но не смог получить правильный результат.

C # код:

     [DllImport("cl.dll", EntryPoint = "GetPalette@0", CallingConvention = CallingConvention.StdCall)]

    private static extern IntPtr libGetPalette();

    public IntPtr GetPalette()
    {
        return libGetPalette();
    }
  

Наконец, я хочу получить строку, подобную этой

             IntPtr result;
            result = imgProcess.GetPallet();

            string pallet;
            pallet = Marshal.PtrToStringAnsi(result);
            MessageBox.Show(pallet);
  

Этот код не работает должным образом.
Может ли мне помочь какой-нибудь текст, пожалуйста, Как я мог бы получить строковое значение из моей DLL-функции C ?

Спасибо

Shahriar

Комментарии:

1. Хорошей практикой является определение того, какую ошибку или поведение вы получаете. Как мы можем узнать, что означает «Этот код не работает должным образом»?

2. У меня есть символы ‘—>’ из этого кода. Но оно должно возвращаться как ‘473757.473767.574767………….’ строка.

Ответ №1:

Вы можете определить свою функцию C в коде C # с типом возвращаемого значения string.

 [DllImport("cl.dll")]
private static extern string GetPalette();
  

А затем просто вызывает его из вашего кода C #.

 string palette = GetPalette();
  

Внутри DllImport атрибута может потребоваться установить правильное соглашение о вызове CallingConvention и кодировку символов CharSet

Комментарии:

1. Я думаю, вы, возможно, захотите объяснить семантику onwership возвращаемых буферов (IIRC . NET освободит память с помощью free()?)

2. Спасибо Лукасу Кабрту. Ваш ответ на 100% правильный. Я использовал CharSet= кодировка. Ansi и изменил мои функции, возвращающие тип как string. И теперь я получаю правильные результаты.

Ответ №2:

Вы сказали C #, что соглашение о вызове является, __stdcall но нет никаких доказательств __stdcall маркировки самой функции. Кроме того, char* может быть UTF-8.

Комментарии:

1. На самом деле, я новичок в .net Interoperability / Marshalling . Я использовал этот код соглашения stdcall из других источников. Возможно, я ошибаюсь. Итак, что я могу сделать сейчас, чтобы получить string из этой DLL-функции C ? Спасибо

2. Изменение вашего кода C # в соответствии с соглашением о вызовах кода C было бы началом.