不能转换结构后面的元帅指向struct
问题描述:
我编码与我的司机进行通信的窗口服务,因此我想,作为一个测试,传递结构给它,并得到一个返回结构。不能转换结构后面的元帅指向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);
引起我的服务日志显示此:
而且该inPointer不为空并且inObjSize是4
我还试图消除T,从SendIOCTL A和仅放置Ť但它是一样的。
预先感谢
答
元帅指针结构中使用这种方法
var test = (T) Marshal.PtrToStructure(inPointer, typeof(T));
不要忘记使用Marshal.FreeHGlobal(inPointer)
当你与我们分配的内存块来完成。
哦,我的结构将连FreeHGlobal右后保持? – L3n
@ L3n当然是。您将释放非托管内存,并且您的结构仍然处于管理状态。 – Mitya