结构指针和固定字符

struct pointer and fixed char

本文关键字:字符 指针 结构      更新时间:2023-10-16

我的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* 上出错 下一个但是当使用固定的字符变量[SIZE_OF_VAR]时,问题解决了,但发生了另一个错误。填充字符*变量是一个新问题!我使用此代码将字符串转换为字符*

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;
    };