Createfile有效,但FileStream Construction上的句柄无效

时间:2015-10-19 09:47:58

标签: c# unity3d filestream hid wiimote

我试图通过HID连接到Unity3D中的Wiimote。

当我打电话给CreateFile()(来自kernel32)a"有效"返回指针,我甚至可以通过HidD_GetPreparsedDataHidP_GetCaps获得Wiimote的功能。返回缓冲区大小等,并且是我期望的大小。但是,当我尝试在句柄上打开FileStream时,它会出现" Invalid Handle&#34 ;.

如果可以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构造函数中设置useAsync = true(但在Unity中仍然是Invalid Handle

1 个答案:

答案 0 :(得分:0)

最后通过kernel32.dll的ReadFile方法使用它... 显然,Unity存在SafeFileHandles的问题..:S 使用此API: http://buiba.blogspot.nl/2009/06/using-winapi-createfile-readfile.html 使阅读成为可能