2014-03-26 50 views
1

您好我想將C/C++ Strcut轉換爲C#以及如何用C#中另一個結構的地址填充結構成員?如何在C#中對NDISUIO_QUERY_OID結構進行編組以執行以下任務

C/C++結構看起來像:

  typedef struct _NDISUIO_QUERY_OID 
     { 
      NDIS_OID  Oid; 
      PTCHAR   ptcDeviceName; 
      UCHAR   Data[sizeof(ULONG)]; 
     } NDISUIO_QUERY_OID, *PNDISUIO_QUERY_OID; 

     typedef struct My_Struct 
     { 
      //leT's have 2 variables... 
      UINT a; 
      UINT b; 
      //sTRUCT may have many no.of variables depending upon the requirement 
     }My_STATS, *PMy_STATS; 

     PNDISUIO_QUERY_OID  pQueryOid = NULL; 

      pQueryOid = (PNDISUIO_QUERY_OID)malloc(sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS)) ; 

      PMy_STATS Statistics; 
      pQueryOid->Oid = ulOIDCode;//Required OID 
     pQueryOid->ptcDeviceName = AUB_NAME;//REquired STRING 

      memcpy(pQueryOid->Data, Statistics, sizeof(My_STATS)); 

      IoctlResult = DeviceIoControl(
             handle, 
             IOCTL_NDISUIO_QUERY_OID_VALUE, 
             pQueryOid, 
             sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS), 
             pQueryOid, 
             sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS), 
             &dwReturnedBytes, 
             NULL); 

獲取IoctlResult成功在C++;

我的C#結構是:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]   
    public struct _NDISUIO_QUERY_OID 
    { 
     public uint  Oid; 
     [MarshalAs(UnmanagedType.LPWStr)] 
     public string   ptcDeviceName; 
     [MarshalAs(UnmanagedType.ByValArray,SizeConst = sizeof(uint))] 
     public byte[] Data; 
    }; 

    My_STATS Sta_Conn_Info = new My_STATS(); 
    _NDISUIO_QUERY_OID QueryOid = new _NDISUIO_QUERY_OID(); 

    QueryOid.Oid = ulOIDCode; // required OID 
    QueryOid.ptcDeviceName = STRING;//Required String 

    //Imported coredll.dll with required prototype for this. 
    IoctlResult = DeviceIoControl(
             handle, 
             IOCTL_NDISUIO_QUERY_OID_VALUE, 
             ref QueryOid, 
             sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS), 
             ref QueryOid, 
             sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS), 
             ref dwReturnedBytes, 
             NULL 
           ); 

問題:如何當元帥的NDISUIO_QUERY結構到另一個結構複製到它的數據成員在C#?以及如何取代在c + +的memcpy?

任何建議或指導方針,將有助於.. :)

謝謝:)

+0

[C/C++結構轉換爲C#.Net CF WinCE]的可能重複(http://stackoverflow.com/questions/22560958/conversion-of-cc-struct-to-c-net-cf-wince ) –

+0

@HansPassant 喜先生.. 結構轉換沒有問題 在這裏,我要在C#中工作的C++ 我添加的代碼在C++中執行任務。 – arya2arya

+0

@HansPassant 在C++中,我使用memcpy將一個結構複製到另一個結構的Data成員中。 我在C#中嘗試的同樣的任務 – arya2arya

回答

1

Data件似乎沒有什麼。它是一個佔位符,結構實際上是可變長度的。我想我會傾向於使用Marshal.AllocHGlobal和手動編組。但你似乎更喜歡聲明一個C#結構。只要您所使用的結構始終是相同的一個,那麼你將宣佈這樣的:

[StructLayout(LayoutKind.Sequential)]   
public struct NDISUIO_QUERY_OID 
{ 
    public uint Oid; 
    [MarshalAs(UnmanagedType.LPWStr)] 
    public string ptcDeviceName; 
    uint a; 
    uint b; 
}; 

這不完全匹配你存在,因爲聲明的結構有大小sizeof(NDISUIO_QUERY_OID)+ sizeof(My_STATS)但隨後的C++代碼將My_STATS結構複製到Data而不是Data之後。

在更一般的說明中,您現在基本上提出了七次問題。我認爲您可能應該退一步,嘗試更好地理解內存佈局。每次提出問題時,都沒有明確說明要爲您的NDISUIO_QUERY_OID結構版本使用哪種佈局。現在是時候讓你清醒了。

+0

謝謝先生! 我對.Net CF沒有深入的瞭解,我開始通過查看一些教程將C++轉換爲C#來完成我的任務,能夠做一些基本的事情。 這是最後的事情。 我必須使結構正確,然後必須將其發送到DeviceIoControl() – arya2arya

相關問題