C# Createfile可以工作,但句柄在FileStream构造上无效
我正试图通过HID连接到Unity3D中的Wiimote 当我调用C# Createfile可以工作,但句柄在FileStream构造上无效,c#,unity3d,filestream,hid,wiimote,C#,Unity3d,Filestream,Hid,Wiimote,我正试图通过HID连接到Unity3D中的Wiimote 当我调用CreateFile()(从内核32)时,返回一个“有效”指针,我甚至可以通过HidD\u GetPreparsedData和HidP\u GetCaps获得Wiimote的功能。返回缓冲区大小等,这是我期望的大小。但是,当我尝试在句柄上打开FileStream时,它会出现“无效句柄”错误 如果我可以GetCaps,这个句柄怎么会在这里无效Marshal32.GetLastWinError()也返回0 相关代码: int i =
CreateFile()
(从内核32)时,返回一个“有效”指针,我甚至可以通过HidD\u GetPreparsedData
和HidP\u GetCaps
获得Wiimote的功能。返回缓冲区大小等,这是我期望的大小。但是,当我尝试在句柄上打开FileStream
时,它会出现“无效句柄”错误
如果我可以GetCaps
,这个句柄怎么会在这里无效<代码>Marshal32.GetLastWinError()也返回0
相关代码:
int i = 0;
foreach (string devPath in devicePaths)
{
Debug.Log(i);
i++;
if (devPath.Contains(VID_NINTENDO))
if (devPath.Contains(PID_WIIMOTE)) // ADD OTHER PID (IF EVER FOUND)
{
try
{
IntPtr dev_Handle = CreateFile(devPath, FileAccess.Read | FileAccess.Write, FileShare.Read | FileShare.Write, IntPtr.Zero, FileMode.Open, FILE_FLAG_OVERLAPPED, IntPtr.Zero); // Gives a "Valid" pointer
IntPtr device_data = IntPtr.Zero;
int inputLength = 0;
try
{
if (!HidD_GetPreparsedData(dev_Handle, out device_data))
{
throw new HIDException("Unable to get Preparsed data from device");
}
HidCaps device_capabilities; // Struct to contain inputlength etc.
HidP_GetCaps(device_data, out device_capabilities);
inputLength = device_capabilities.InputReportByteLength;
int outputLength = device_capabilities.OutputReportByteLength;
FileStream stream = new FileStream(dev_Handle, FileAccess.Read | FileAccess.Write, true, inputLength); // INVALID HANDLE
//FileStream stream = new FileStream(new SafeFileHandle(dev_Handle, false), FileAccess.Read | FileAccess.Write, inputLength, true); // Invalid Handle
//FileStream stream = new FileStream(dev_Handle, FileAccess.Read | FileAccess.Write, true, inputLength); // Invalid Handle
//FileStream stream = new FileStream(devPath, FileMode.Open, FileAccess.Read | FileAccess.Write, FileShare.Read | FileShare.Write, inputLength); // nullref (The file isnt being created in this path)
Debug.Log(dev_Handle);
}
catch (Exception e)
{
HandleException(e, "HIDException");
}
finally
{
HidD_FreePreparsedData(ref device_data);
}
}
catch (Exception e)
{
HandleException(e, "HIDException");
}
}
}
此外,在一个常规的C#项目中,它只是工作:((虽然我必须在FileStream构造函数中设置UseAncy=true(但在Unity中仍然是
无效句柄)最终通过使用kernel32.dll
的ReadFile方法使它工作起来。。。
显然,Unity在SafeFileHandles方面存在问题:S
使用此API:
使阅读成为可能请看,共识是“不,他们不应该”!