J'essaie de me connecter à une Wiimote dans Unity3D via HID.Createfile fonctionne, mais le handle n'est pas valide sur FileStream Construction
Quand j'appelle CreateFile()
(de kernel32) un pointeur « valide » est retourné, et je peux même obtenir les capacités de la Wiimote par HidD_GetPreparsedData
et HidP_GetCaps
. Buffer-size etc. est retourné, et est la taille que j'attends. Cependant, quand j'essaie d'ouvrir un FileStream
sur la poignée, il commet des erreurs avec "Invalid Handle".
Comment cette poignée peut-elle être invalide ici si je peux GetCaps
? Marshal32.GetLastWinError()
est également retournaient 0.
Code pertinent:
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");
}
}
}
En outre, dans un projet régulier C# cela fonctionne simplement :((bien que je ne dois mettre useAsync = true dans le constructeur FileStream (encore Invalid Handle
en unité cependant)
Veuillez consulter ["Les questions doivent-elles inclure" les balises "dans leurs titres?"] (Http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their- titres), où le consensus est "non, ils ne devraient pas"! –