Проблемы преобразования структуры из C ++ в C # .Net Compact Framework

Я конвертирую структуры 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 ().

Может кто-нибудь разъяснить мне о преобразованиях и дать мне знать, если я сделал что-то не так.

2

Решение

За 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 и делать все сортировки вручную, я боюсь.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]