Witam, już mam pytanie dotyczącą odebrania kolejnej struktury, otóż mam w c++ coś takiego:
struct foo
{
int id;
char[12] name;
struct
{
unsigned index;
type_t type;
int dir;
status status;
union {
struct {
int conf_slot;
} aud;
struct {
int win_in;
int cap_dev;
} vid;
} stream;
} media[MAX_SDP];
}
</code=cpp>
type_t, i status to kolejne stuktury ale z nimi sobie poradziłem i wiem że na pewno działa, z kolei mam problem z media[max_sdp] czy dobrze zmarshalowałem i nie jestem pewien co do tego union, albo może problem tkwi w czymś innym, robie coś takiego:
```csharp
[StructLayout(LayoutKind.Sequential)]
public struct foo
{
int id;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
string name;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public mediat_[] media;
[StructLayout(LayoutKind.Sequential)]
public struct mediat_
{
public uint index;
public typet type;
public int dir;
statust status;
public streamt_ stream;
}
[StructLayout(LayoutKind.Explicit)]
public struct streamt_
{
[FieldOffset(0)]
public audt_ aud;
[FieldOffset(4)]
public vidt_ vid;
}
[StructLayout(LayoutKind.Sequential)]
public struct audt_
{
public int conf_slot;
}
[StructLayout(LayoutKind.Sequential)]
public struct vidt_
{
public int win_in;
public int cap_dev;
}
}
i to powoduje że pojawia mi się taki komunikat:
System.TypeLoadException was unhandled
Message="Nie można załadować typu 'foo' z zestawu 'dllwrapper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'."
Source="Test2"
TypeName="dllwrapper.foo"
z kolei jeśli robię coś takiego:
...
public mediat_ media;
...
[StructLayout(LayoutKind.Sequential, Size = 384)]
public struct mediat_{
...
}...
}
To wtedy się nie wykłada program, odczytuje wartości z tej struktury dla miedia[0] niestety interesują mnie informacje zawarte w miedia[1] ale nie mogę się tam dostać, kiedy próbowałem dodać
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public mediat_[] media;
do tej struktury także pojawiał się bład, co prawda inny niż ten wyżej ale mówiący o nieprawidłowej strukturze. Dziwi mnie też to że udało mi się odebrać strukturę która miała także stukture w strukturze typu [] i tam "poszło" od razu, więc myślę że może z tym union coś jest nie tak...
i jeszcze jedno pytanie da się zastąpić #define z c++ jakoś? i kolejne dotyczący importowania enuma jak ugryźć coś takiego?
enum format_id {
FORMAT_L16 = 0,
FORMAT_PCM = FORMAT_L16,
FORMAT_PCMA = FORMAT_PACK('A', 'L', 'A', 'W'),
FORMAT_ALAW = FORMAT_PCMA,...
};
gdzie
#define FORMAT_PACK(C1, C2, C3, C4) FOURCC(C1, C2, C3, C4)
#define FOURCC(C1, C2, C3, C4) ( C4<<24 | C3<<16 | C2<<8 | C1 )
uff to chyba wszystko z moich niewiadomych.