У меня есть dll (C #), вызываемая сторонней системой.
Это системный вызов функции fnSys и передача в качестве параметра пустого указателя.
Теперь мне нужно наложить эту пустоту * на мою структуру.
Мой код:
public struct Menu
{
public string str1;
public string str2;
}
public static unsafe int fnSys(void* value)
{
if (value!=null)
{
System.Windows.Forms.MessageBox.Show("msg");
}
return 1;
}
Теперь, когда сторонний системный вызов вызывает эту функцию, появляется окно сообщения, но я не могу понять, как мне преобразовать это значение в MenuItem.
Также я попробовал так:
Menu menu = (Menu)Marshal.PtrToStructure(value, typeof(Menu));
но это не работает.
Есть ли способы?
Я нашел решение:
[StructLayout(LayoutKind.Sequential, Pack = 1, Size=255, CharSet = CharSet.Ansi)]
public struct Menu
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
public string str1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 255)]
public string str2;
}
public static unsafe int fnSys(Menu value)
{
if (value!=null)
{
System.Windows.Forms.MessageBox.Show("msg");
}
return 1;
}
Атрибут StructLayout позволяет нам контролировать поля данных в памяти.
Более подробно это ссылка на сайт
Других решений пока нет …