Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рекурсивная структура C#, Как создать рекурсивную структуру на C# 
V
    Опции темы
erm0l0v
Дата 17.1.2011, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: 1
Всего: 1



Есть код на Delphi, там используется структура

Код

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


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

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

По всей видимости нужно использовать Marshal, правда не совсем понимаю как.
PM MAIL   Вверх
erm0l0v
Дата 17.1.2011, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: 1
Всего: 1



Я сделал так:

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

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
PM MAIL   Вверх
Kaerus
Дата 17.1.2011, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


WPF'er
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 3.9.2010

Репутация: нет
Всего: 1



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

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

Это сообщение отредактировал(а) Kaerus - 17.1.2011, 16:02
PM MAIL ICQ   Вверх
erm0l0v
Дата 17.1.2011, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: 1
Всего: 1



проблему решил:

Код

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


Добавлено через 1 минуту и 50 секунд
Не совсем понимаю как в моем примере можно использовать класс. (Доступа к коду на Delphi нет, там по любому будет структура)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0601 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.