2014-03-26 44 views
2

我將c/C++結構轉換爲C#標準。從C++到C#的結構轉換問題.Net Compact Framework

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; 
    }; 

我使用此>>>reference

Marshal.SizeOf()在WIN CE工作轉換的數據類型。我測試了它。

如果我的結構轉換很好,那麼肯定Marshal.SizeOf()將工作來獲取結構的大小,但它會拋出異常並在DeviceIoControl()API中返回error code 87

任何人都可以澄清我的轉換,並讓我知道如果我做錯了什麼。

回答

2

對於bssidssid 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] 

你在C#中使用的char是不正確的,因爲char寬兩個字節在C#。

_NDISUIO_QUERY_OID,你必須

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = sizeof(uint))] 
public byte[] Data; 

我認爲,你需要使用ByValArray而非ByValTStr。但正如我們在最近的許多問題中所討論的那樣,該成員的確切含義尚不清楚。它是一個固定長度的字節數組,還是一個可變長度的緩衝區?你有沒有C++代碼的示例嗎?這將一勞永逸地解決辯論。


OK,從標題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來分配結構,並且手動進行所有的編組。

+0

先生.. 數組轉換是有用的, 先生如何初始化這些數組? 我們可以有新的byte [size];但我在哪裏可以初始化代碼? 或者我們可以維護任何構造函數嗎? 沒有初始化數組'Marshal.Sizeof()'拋出異常。 在C/C++中我們有這個靈活性 'unsigned char bssid [6]; ' – arya2arya

+1

你當然可以使用構造函數。或者返回結構的新實例的靜態方法。 –

+0

爵士 [這QN將介紹我的完整任務(http://stackoverflow.com/questions/22639086/issues-in-conversion-of-code-from-c-to-c-sharp-to-實現所需任務) – arya2arya