2017-08-20 22 views
0

我编码与我的司机进行通信的窗口服务,因此我想,作为一个测试,传递结构给它,并得到一个返回结构。不能转换结构后面的元帅指向struct

在C++中,这是在C#中的工作。然而,我不能够转换成一个IntPtr使用元帅结构,这就是为什么我不能够得到结构从驱动程序返回。

结构:

[StructLayout(LayoutKind.Sequential)] 
struct TestEst 
{ 
    public int value; 
} 

然后在我的司机:

typedef struct _TEST_EST 
{ 
    int value; 
} TEST_EST, *PTEST_EST; 

,这是将要通过IOCTL传递结构的代码是:

void SendIOCTL<T>(IntPtr hDevice, uint dwIoControlCode, ref T inObj, ref T outObj) 
    { 
     IntPtr inPointer = IntPtr.Zero; 
     IntPtr outPointer = IntPtr.Zero; 
     int inObjSize = 0; 
     int outObjSize = 0; 
     uint bytesReturned = 0; 

     if(inObj != null) 
     { 
      inObjSize = Marshal.SizeOf(inObj.GetType()); 
      inPointer = Marshal.AllocHGlobal(inObjSize); 
      Marshal.StructureToPtr(inObj, inPointer, false); 

      if (dwIoControlCode == TEST_CTL) // the TEST IOCTL 
      { 
       TestEst lets = new TestEst(); 

       Logger.Log("IsNull: " + (inPointer == IntPtr.Zero)); 
       Logger.Log("SizeObj: " + inObjSize); 

       Marshal.PtrToStructure(inPointer, lets); 
       Logger.Log("Working!: " + lets.value); 
      } 
     } 
    } 



public void SendTest() 
    { 
     TestEst request = new TestEst(); 
     TestEst result = new TestEst(); 

     request.value = 30; 

     SendIOCTL(hDriver, TEST_CTL, ref request, ref result); 

     Logger.Log("RA: " + result.value + " " + request.value); 
    } 

记录仪。日志()简单地写入Windows事件查看器中的条目。

我省略了实际的DeviceIoControl因为这不是地方失败,正在发生的事情是在

Marshal.PtrToStructure(inPointer, lets); 

引起我的服务日志显示此:

Windows Event Viewer

而且该inPointer不为空并且inObjSize是4

我还试图消除T,从SendIOCTL A和仅放置Ť但它是一样的。

预先感谢

回答

1

元帅指针结构中使用这种方法

var test = (T) Marshal.PtrToStructure(inPointer, typeof(T)); 

不要忘记使用Marshal.FreeHGlobal(inPointer)当你与我们分配的内存块来完成。

+0

哦,我的结构将连FreeHGlobal右后保持? – L3n

+1

@ L3n当然是。您将释放非托管内存,并且您的结构仍然处于管理状态。 – Mitya