#c# #c #mfc
#c# #c #mfc
Вопрос:
У меня есть библиотека C , и я написал в ней несколько функций.
эта функция должна возвращать целое число и строку. (2 вывода), и я собираюсь вызвать эту функцию из моей программы на C #.
вот мой код на C :
extern "C"{
__declspec(dllexport) UINT Read(OUT char* Temp )
{
.....
}
}
и это мой код на C # в ImportDll
классе:
[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read(char[] temp);
и в моей форме у меня есть это:
char[] str = new char[256];
ImportDLL.Read(str);
он возвращает значение Int правильно, но результат строки (массив str) полностью равен нулю ()!
что не так с моим кодом?
Спасибо.
Комментарии:
1. Зачем использовать char[], вы можете использовать string .
2. Если у вас есть код dll, вы можете отладить функцию «Чтения» и посмотреть, что происходит внутри функции.
Ответ №1:
Одно дополнение к ответу от Мэтью Уотсона: вам также потребуется присвоить параметру stringbuilder значение LPSTR (char *), например
[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern uint Read([MarshalAs(UnmanagedType.LPStr)] StringBuilder temp);
Ответ №2:
Поскольку возвращаемое значение является OUT , я предполагаю, что оно создано методом C .
В этом случае вам может потребоваться передать ей StringBuilder:
[DllImport("Library.dll", CallingConvention = CallingConvention.Cdecl, CharSet=CharSet.Unicode)]
public static extern uint Read(StringBuilder temp);
Обратите внимание, что вы также должны указать кодировку, которая зависит от кодировки символов, используемой вашим кодом C — ANSI или Unicode.
Чтобы вызвать ее, создайте новый StringBuilder достаточного размера и передайте его Read()
, а затем используйте StringBuilder .toString() для извлечения строки после Read()
возврата.
Если функция C ожидает, что строковый буфер определенного размера, вам необходимо создать StringBuilder, чтобы он был как минимум такого размера, например:
const int BUFFER_SIZE = 128;
var sb = new StringBuilder(BUFFER_SIZE);
Read(sb);
var result = sb.ToString();
Примечание: трудно сказать, действительно ли это правильное решение, не зная деталей функции C . Возможно, вам просто нужно передать строку.
Комментарии:
1. Большое вам спасибо, это было полезно, но правильный ответ таков: [MarshalAs(UnmanagedType . LPStr)] StringBuilder temp