Я конвертирую структуры c / c ++ в стандарты C #.
C / C ++ Структуры:
typedef struct _sta_conn_info{
STA_CONNECT_STATE connect_state;//Enum
STA_ASSOC_STATE assoc_state;//Enum
unsigned char bssid[6];
unsigned char ssid[34];
unsigned long channel;
enum mode mode;//Enum
unsigned long signalStrength;
unsigned long noiseLevel;
STA_AUTH_ALG auth_alg;//enum
STA_ENCRYPT_ALG encrypt_alg;//enum
}STA_CONN_INFO;typedef struct _NDISUIO_QUERY_OID
{
NDIS_OID Oid;
PTCHAR ptcDeviceName;
UCHAR Data[sizeof(ULONG)];
} NDISUIO_QUERY_OID, *PNDISUIO_QUERY_OID;
Соответствующие C # структуры:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct _sta_conn_info
{
public _sta_connect_state connect_state;
public _sta_assoc_state assoc_state;
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 6)]
public char[] bssid ;//= new char[6];
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 34)]
public char[] ssid ;//= new char[34]
public uint channel;
public mode mode;
public uint signalStrength;
public uint noiseLevel;
public _sta_auth_alg auth_alg;
public _sta_encrypt_alg encrypt_alg;
}
QUERY STRUCT:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct _NDISUIO_QUERY_OID
{
public uint Oid;
[MarshalAs(UnmanagedType.LPWStr)]
public string ptcDeviceName;
public byte[] Data;
};
Я преобразовал типы данных, используя это >>>ссылка
Marshal.SizeOf()
работает в WIN CE. Я проверял это.
Если моя структура преобразования в порядке, то, безусловно, Marshal.SizeOf()
будет работать, чтобы получить размер структуры, но он выбрасывает исключения и возвращает error code 87
в API-интерфейсе DeviceIoControl ().
Может кто-нибудь разъяснить мне о преобразованиях и дать мне знать, если я сделал что-то не так.
За bssid
а также ssid
декларации C ++:
unsigned char bssid[6];
unsigned char ssid[34];
Сейчас, unsigned char
является одним байтом и обычно используется для байтовых массивов, а не текста. Таким образом, C # должен быть:
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 6)]
public byte[] bssid ;//= new byte[6];
[MarshalAs(UnmanagedType.ByValArray,SizeConst = 34)]
public byte[] ssid ;//= new byte[34]
Ваше использование char
в C # не правильно, потому что char
имеет ширину два байта в C #.
В _NDISUIO_QUERY_OID
где у вас есть
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = sizeof(uint))]
public byte[] Data;
Я считаю, что вам нужно использовать ByValArray
скорее, чем ByValTStr
, Но, как мы обсуждали во многих ваших недавних вопросах, точное значение этого члена неясно. Это действительно байтовый массив фиксированной длины или буфер переменной длины? У вас есть пример кода C ++, который работает? Это решило бы спор раз и навсегда.
Хорошо из шапки nuiouser.h
заголовочный файл у меня такой:
//
// Structure to go with IOCTL_NDISUIO_QUERY_OID_VALUE.
// The Data part is of variable length, determined by
// the input buffer length passed to DeviceIoControl.
//
typedef struct _NDISUIO_QUERY_OID
{
NDIS_OID Oid;
#ifdef UNDER_CE
//
// In CE land app is allowed to query without having to do
// IOCTL_NDISUIO_OPEN_DEVICE
// Hence the device name to query argument needed..
// For app that does IOCTL_NDISUIO_OPEN_DEVICE this argument
// is then not necessary..
//
PTCHAR ptcDeviceName;
#endif
UCHAR Data[sizeof(ULONG)];
} NDISUIO_QUERY_OID, *PNDISUIO_QUERY_OID;
Что говорит вам окончательно, что Data
переменная длина. Вам нужно будет выделить структуру с AllocHGlobal
и делать все сортировки вручную, я боюсь.
Других решений пока нет …