2

我正在将 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 87DeviceIoControl() API。

谁能澄清我的转换,如果我做错了什么,请告诉我。

4

1 回答 1

2

ForbssidssidC++ 声明是:

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恐怕您需要手动分配结构并进行所有编组。

于 2014-03-26T12:23:56.203 回答