Здравствуйте, Аноним, Вы писали:
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 массиву..
в этом случае получается только привести указатель на первый элемент массива..
То есть меня интересует как можно передавать структуры которые содержат в качестве своих полей
указатели на массивы переменной длины..
Здравствуйте, <Аноним>, Вы писали:
А>Есть динамическая библиотека — не 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;
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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;
А>Мне казалось что через 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Кстати, твое описание на Дельфи не эквивалентно сишному: А>struct bbbb { А> int size; А> aaaa** p; А>}
В Дельфи косвенность одинарная, что спокойно описывается классом.
Только у класса обязательно нужно задать как [StructLayout(LayoutKind.Sequential)].
... << RSDN@Home 1.2.0 alpha rev. 611>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.