2015-01-27 2 views
-1

я иметь структуру в моем 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; 
    }; 

, поле следующего является указателем такой же структура. когда я использую обугленных [] вар для строковых переменного, поскольку структура не имеет размера починки VS взять ошибку на общественном ST_HDTextInfo * следующего но при использовании фиксированных обугленного уаг [SIZE_OF_VAR] проблема решительности, но произойти еще одна ошибки. Заполнение переменной char * является новой проблемой! Я использую этот код для преобразования counst строки на символ *

IntPtr p = Marshal.StringToHGlobalAuto("Poor Richard"); 
char* newCharStr = (char*)(p.ToPointer()); 

text_info.font_name = newCharStr; 

в этой станции моя строка новообращенного обугливается * но VS принять эту ошибку «Левая рука присваивания должен быть переменной, свойство или индексатор» !!!

+0

Должен иметь возможность использовать 'string' как тип. то есть 'public string font_name ', не говоря уже о том, что будет немедленно исправлять все, но это способ пойти и позволить маршаллировать беспокойство по поводу символов и указателей и т. д. – weston

+1

Строка 'char *' не является 'UnmanagedType.ByValTStr'. Попробуйте 'UnmanagedType.LPStr' и обычную строку вместо' char [] '. – Chris

+0

Что такое EN_FontStyle? –

ответ

0

Я решаю эту проблему. Я использую этот пример кода

[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; 
    }; 
Смежные вопросы