Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Рекурсивная структура C#


Автор: erm0l0v 17.1.2011, 12:42
Есть код на Delphi, там используется структура

Код

PWPModPostData = ^ TWPModPostData;
TWPModPostData = record
   DataType: Integer;
   Data: PChar;            
   Next: PWPModPostData;   
end;


Как создать такую-же структуру на C#, чтобы можно было передать в Delphi?

Мне в конечном итоге нужно преобразовать эту структуру в IntPtr. 

По всей видимости нужно использовать Marshal, правда не совсем понимаю как.

Автор: erm0l0v 17.1.2011, 14:24
Я сделал так:

Объявил структуру
Код

public struct PWPModPostData
{
    public IntPtr DataType;
    public IntPtr Data;
    public IntPtr Next;
}


А заполняю так:
Код

PWPModPostData modPostDate;
modPostDate.DataType = new IntPtr();
Marshal.WriteInt32(modPostDate.DataType, 1);
modPostDate.Data = Marshal.StringToHGlobalAnsi("1\0");
modPostDate.Next = IntPtr.Zero;

IntPtr modPrt = new IntPtr();

Marshal.StructureToPtr(modPostDate, modPrt, true);


Но так при заполнении выдает ошибку.

Код

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at System.Runtime.InteropServices.Marshal.WriteInt32(IntPtr ptr, Int32 ofs, Int32 val)
   at WinPostCSharpDll.WinPost.WinPostMessage.Post()
   at WinPostCSharpDll.Forms.ReceivingForm.buttonPost_Click(Object sender, EventArgs e)
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


Видимо нужно определить размер данных где то при объявлении IntPtr

Автор: Kaerus 17.1.2011, 16:00
Про заполнение: во второй строке ты просто полю DataType присваиваешь пустой IntPrt который указывает на адрес 0x00000000, а затем в 3 строке ты записываешь в память по нулевому адресу - по этому и ошибка записи в зашищенную память

P.S.
Не понимаю зачем вообще работать со структурами (поля которых хранятся в стеке), когда есть классы

Автор: erm0l0v 17.1.2011, 16:20
проблему решил:

Код

int number = 1;
modPostDate.DataType = Marshal.AllocHGlobal(Marshal.SizeOf(number));


Добавлено через 1 минуту и 50 секунд
Не совсем понимаю как в моем примере можно использовать класс. (Доступа к коду на Delphi нет, там по любому будет структура)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)