Re[3]: Marshaling структуры
От: GlebZ Россия  
Дата: 09.09.05 16:14
Оценка: +1
Здравствуйте, Аноним, Вы писали:

VD>>Приведи описание структуры на С/С++.


А>На С++ это выглядело бы так (просто реально библиотека на Delphi)

Нет, тогда уж лучше на Delphi. А то разница между ними кардинальная.

С уважением, Gleb.
Marshaling структуры
От: Аноним  
Дата: 09.09.05 08:53
Оценка:
Есть динамическая библиотека — не Com. Для типов в .VB .Net приложении созданы соответствующие
managed структуры

<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Public Structure AAAA
'name
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=33)> Public name() As Char
'company name
<MarshalAs(UnmanagedType.ByValArray, SizeConst:=33)> Public company() As Char
'notional open date
End Structure


Public Structure BBBB
'elements count in data array
Public Count As Integer
'data array pointer
'pointer to AAAA[]
'problem field
Public P As IntPtr '?
End Structure

''''''''''''''''''''''''''''''
В коде —
Dim data As IntPtr
' data initialization
Dim bbbb As BBBB
bbbb = Marshal.PtrToStructure(data, bbbb.GetType())

Dim aaaa() As AAAA
aaaa = Marshal.PtrToStructure(bbbb.P, aaaa.GetType())

Такой код не работает. Так как не получается привести указатель на С-массив к managed массиву..
в этом случае получается только привести указатель на первый элемент массива..

То есть меня интересует как можно передавать структуры которые содержат в качестве своих полей
указатели на массивы переменной длины..
Re: Marshaling структуры
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.09.05 14:02
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть динамическая библиотека — не Com. Для типов в .VB .Net приложении созданы соответствующие

А>managed структуры

А><StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Public Structure AAAA

А> 'name
А> <MarshalAs(UnmanagedType.ByValArray, SizeConst:=33)> Public name() As Char
А> 'company name
А> <MarshalAs(UnmanagedType.ByValArray, SizeConst:=33)> Public company() As Char
А> 'notional open date
А>End Structure

Вложенные строки лучше нужно описывать как StringBuildet.

А>Такой код не работает. Так как не получается привести указатель на С-массив к managed массиву..

А>в этом случае получается только привести указатель на первый элемент массива..

Приведи описание структуры на С/С++.
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Marshaling структуры
От: Аноним  
Дата: 09.09.05 15:58
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, <Аноним>, Вы писали:


А>>Есть динамическая библиотека — не Com. Для типов в .VB .Net приложении созданы соответствующие

А>>managed структуры

А>><StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> Public Structure AAAA

А>> 'name
А>> <MarshalAs(UnmanagedType.ByValArray, SizeConst:=33)> Public name() As Char
А>> 'company name
А>> <MarshalAs(UnmanagedType.ByValArray, SizeConst:=33)> Public company() As Char
А>> 'notional open date
А>>End Structure

VD>Вложенные строки лучше нужно описывать как StringBuildet.

Мне казалось что через StringBuilder нельзя указать фиксированный размер буфера.. то есть
чтобы структура была фиксированного размера. При маршалинге — возникает ошибка, потому что
не известен этот присловутый размер массива.

А>>Такой код не работает. Так как не получается привести указатель на С-массив к managed массиву..

А>>в этом случае получается только привести указатель на первый элемент массива..

VD>Приведи описание структуры на С/С++.


На С++ это выглядело бы так (просто реально библиотека на Delphi)
struct aaaa {
char name[33];
char company[33];
};

struct bbbb {
int size;
aaaa** p;
}
Re[4]: Marshaling структуры
От: Аноним  
Дата: 09.09.05 16:24
Оценка:
Здравствуйте, GlebZ, Вы писали:

GZ>Здравствуйте, Аноним, Вы писали:


VD>>>Приведи описание структуры на С/С++.


А>>На С++ это выглядело бы так (просто реально библиотека на Delphi)

GZ>Нет, тогда уж лучше на Delphi. А то разница между ними кардинальная.

GZ>С уважением, Gleb.


PAAAA = ^AAAATIapiInstrument;
AAAA = packed record
name : array[0..32] of TIapiWideChar;
company : array[0..32] of TIapiWideChar;
end;

PAAAAArray = ^AAAAArray;
AAAAArray = array [0..MAXINT div SizeOf(AAAA) — 1] of AAAA;


PBBBB = ^BBBB;
BBBB = packed record
Count: Integer;
P: PAAAAArray;
end;
Re[5]: Marshaling структуры
От: pCaveman  
Дата: 09.09.05 16:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, GlebZ, Вы писали:


GZ>>Здравствуйте, Аноним, Вы писали:


VD>>>>Приведи описание структуры на С/С++.


А>>>На С++ это выглядело бы так (просто реально библиотека на Delphi)

GZ>>Нет, тогда уж лучше на Delphi. А то разница между ними кардинальная.

GZ>>С уважением, Gleb.


PAAAA = ^AAAA;
AAAA = packed record
name : array[0..32] of WideChar;
company : array[0..32] of WideChar;
end;

PAAAAArray = ^AAAAArray;
AAAAArray = array [0..MAXINT div SizeOf(AAAA) — 1] of AAAA;


PBBBB = ^BBBB;
BBBB = packed record
Count: Integer;
P: PAAAAArray;
end;

то есть вот так
Re[6]: Marshaling структуры
От: GlebZ Россия  
Дата: 09.09.05 17:04
Оценка:
Здравствуйте, pCaveman, Вы писали:

Насколько я помню, packed нужно указывать также для массивов. Второе, посмотри для UnmanagedType.LPArray для массива вместо IntPtr.

С уважением, Gleb.
Re[3]: Marshaling структуры
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.09.05 21:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>Мне казалось что через StringBuilder нельзя указать фиксированный размер буфера.. то есть

А>чтобы структура была фиксированного размера. При маршалинге — возникает ошибка, потому что
А>не известен этот присловутый размер массива.

Тебе просто казалось.
Опиши параметр как имеющий тип StringBuilder и пометь его атрибутом MarshalAs с типом ByValTStr. При этом о фиксировангом размере ты должен сказать указав свойство SizeConst атрибута MarshalAs. Ну, а далее останется только создать StringBuilder и проинициализировать его так чтобы в нем было зарезервировано нужный объем памяти.

StringBuilder используется когда нужно копировать содержимое строк в буфер заданный в управляемом коде. Т.е. когда неуправляемый код должен вернуть содержимое строк управляемому и буфер должна занимать управляемая сторона.

Вот тут об этом рассказывается в мсдн http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcondefaultmarshalingforstrings.asp

А>На С++ это выглядело бы так (просто реально библиотека на Delphi)

Этот тип нужно описывать в C# как класс, так как bbbb ссылается на него, а не содержит его копию.
А>struct aaaa {
Эти два параметра должны быть StringBuilder-ами. При этом нужно указать ByValTStr, SizeConst = 33 и проинициализировать StringBuilder-ы задав им нужный объем памяти (new StringBuilder(33)).
А> char name[33];
А> char company[33];
А>};

А>struct bbbb {

А> int size;
А вот тут будут проблемы. Зачем понадобилась двойная ссылка? Это на C# описать нельзя. Так что правте структу выкидывая лишнюю косвенность (*).
А> aaaa** p;
А>}
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Marshaling структуры
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.09.05 21:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А> PBBBB = ^BBBB;

А> BBBB = packed record
А> Count: Integer;
А> P: PAAAAArray;
А> end;

Кстати, твое описание на Дельфи не эквивалентно сишному:
А>struct bbbb {
А> int size;
А> aaaa** p;
А>}
В Дельфи косвенность одинарная, что спокойно описывается классом.

Только у класса обязательно нужно задать как [StructLayout(LayoutKind.Sequential)].
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Marshaling структуры
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.09.05 21:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А это что?
А> AAAAArray = array [0..MAXINT div SizeOf(AAAA) — 1] of AAAA;
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.