K
KeithR
I am something of a newbie in the world of C# data structures, but I am
writing an application that needs to call a legacy DLL using .net 1.1. That
is no big deal mostly, but I am having trouble with one function. It is
defined in the original C as
UINT32 __stdcall GetState(
UINT32 timeout,
UINT32 client_id,
void *status_array
);
status is defines as a pointer to 64 status records (structs) they are
defined as
typedef struct status_rec {
UINT32 type;
UINT32 state;
UINT32 version;
UINT32 flags;
CHAR ip_address[15];
CHAR filler[9];
} status, *p_status
I defined this in C# as
[StructLayout=LayoutType.Sequential, Pack=1, CharSet = CharSet.Ansii]
public struct status_rec {
public UINT32 type;
public UINT32 state;
public UINT32 version;
public UINT32 flags;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1,
SizeConst=15)]
public CHAR ip_address[15];
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1,
SizeConst=15)]
public CHAR filler[9];
}
I made my call as
status_rec[] status_array = new status_rec[64];
GetState(
timeout,
client_id,
ref status_array[0]
);
What I am getting in Status_array is the correct data in the first element,
and all zeroes thereafter.
Can anybody please point me to my mistake?
writing an application that needs to call a legacy DLL using .net 1.1. That
is no big deal mostly, but I am having trouble with one function. It is
defined in the original C as
UINT32 __stdcall GetState(
UINT32 timeout,
UINT32 client_id,
void *status_array
);
status is defines as a pointer to 64 status records (structs) they are
defined as
typedef struct status_rec {
UINT32 type;
UINT32 state;
UINT32 version;
UINT32 flags;
CHAR ip_address[15];
CHAR filler[9];
} status, *p_status
I defined this in C# as
[StructLayout=LayoutType.Sequential, Pack=1, CharSet = CharSet.Ansii]
public struct status_rec {
public UINT32 type;
public UINT32 state;
public UINT32 version;
public UINT32 flags;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1,
SizeConst=15)]
public CHAR ip_address[15];
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1,
SizeConst=15)]
public CHAR filler[9];
}
I made my call as
status_rec[] status_array = new status_rec[64];
GetState(
timeout,
client_id,
ref status_array[0]
);
What I am getting in Status_array is the correct data in the first element,
and all zeroes thereafter.
Can anybody please point me to my mistake?