у меня есть структура в моем C ++, как это
struct ST_HDTextInfo
{
char* font_name;
char* text;
unsigned int font_color;
unsigned int background_color;
int style;
int font_size;
struct ST_HDTextInfo* next;
};
и я переопределить его в моем коде C #, как это
[StructLayout(LayoutKind.Sequential,Pack=4)]
unsafe struct ST_HDTextInfo
{
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 25)]
public fixed char font_name[25];
[MarshalAs(UnmanagedType.ByValTStr, ArraySubType = UnmanagedType.I1, SizeConst = 20)]
public char[] text;
[MarshalAs(UnmanagedType.SysUInt)]
public uint font_color;
[MarshalAs(UnmanagedType.SysUInt)]
public uint background_color;
[MarshalAs(UnmanagedType.SysInt)]
public EN_FontStyle style;
[MarshalAs(UnmanagedType.SysInt)]
public int font_size;
[MarshalAs(UnmanagedType.SysInt)]
public ST_HDTextInfo* next;
};
поле следующий это указатель на ту же структуру. когда я использую char [] var для строковой переменной, потому что структура не имеет фиксированный размер VS принять ошибку на общедоступный ST_HDTextInfo * следующий
но при использовании фиксированного char var [SIZE_OF_VAR] проблема решается, но возникает другая ошибка. Заполнение переменной char * — новая проблема! я использую этот код для преобразования счетной строки в символ *
IntPtr p = Marshal.StringToHGlobalAuto("Poor Richard");
char* newCharStr = (char*)(p.ToPointer());
text_info.font_name = newCharStr;
в этой станции моя строка конвертируется в char *, но VS принимает эту ошибку «Левая часть присваивания должна быть переменной, свойством или индексатором» !!!
я решаю эту проблему. Я использую этот пример кода
[StructLayoutAttribute(LayoutKind.Explicit, CharSet = CharSet.Auto, Size=80)]
internal unsafe struct ST_HDTextInfo
{
[FieldOffset(0)]
public fixed char text[25];
[FieldOffset(0)]
public fixed char font_name[20];
[MarshalAs(UnmanagedType.I4)]
[FieldOffset(0)]
public uint font_color;
[MarshalAs(UnmanagedType.I4)]
[FieldOffset(0)]
public uint background_color;
[MarshalAs(UnmanagedType.I4)]
[FieldOffset(0)]
public EN_FontStyle style;
[MarshalAs(UnmanagedType.I4)]
[FieldOffset(0)]
public int font_size;
[FieldOffset(80 - sizeof(long))]
public ST_HDTextInfo* next;
};