当我关闭UI时出现错误0x80131623

时间:2014-06-19 12:42:54

标签: c# error-handling pinvoke

我正在尝试查找供应商ID和USB卡的产品ID。为此,我使用setupapi.dll。当我关闭我的程序时,我出现了0x80131623(2146232797)。我不知道如何解决它。

我的代码是:

result = HidD_GetHidGuid(ref HidGuid);


         DeviceInfoSet = SetupDiGetClassDevs(ref HidGuid, IntPtr.Zero, IntPtr.Zero, 18);


        do
        {
            SP_DEVICE_INTERFACE_DATA MyDeviceInterfaceData = new SP_DEVICE_INTERFACE_DATA();
            MyDeviceInterfaceData.cbSize = 28;

            result = SetupDiEnumDeviceInterfaces(DeviceInfoSet, IntPtr.Zero, ref HidGuid, MemberIndex, ref MyDeviceInterfaceData);
            //int lastError = Marshal.GetLastWin32Error();
            if (result != 0)
            {
                //SP_DEVINFO_DATA MyDeviceInfoData = new SP_DEVINFO_DATA();
                //MyDeviceInfoData.cbSize = Marshal.SizeOf(MyDeviceInfoData);



                //Premier appel pour obtenir la taille du buffer
                result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, ref MyDeviceInterfaceData, IntPtr.Zero, 0, out neededSize, IntPtr.Zero);
                //int lastError = Marshal.GetLastWin32Error();
                int requiredSize = (int)neededSize;


                SP_DEVICE_INTERFACE_DETAIL_DATA MyDeviceInterfaceDetailData = new SP_DEVICE_INTERFACE_DETAIL_DATA();
                if (IntPtr.Size == 8) // for 64 bit operating systems
                    MyDeviceInterfaceDetailData.cbSize = 8;
                else
                    MyDeviceInterfaceDetailData.cbSize = 4 + Marshal.SystemDefaultCharSize; // for 32 bit systems


                 IntPtr detailDataBuffer = Marshal.AllocHGlobal(requiredSize);
                  Marshal.StructureToPtr(MyDeviceInterfaceDetailData, detailDataBuffer, true);


                  result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, ref MyDeviceInterfaceData, detailDataBuffer, requiredSize, out neededSize, IntPtr.Zero);
                  int lastError = Marshal.GetLastWin32Error();

                  //string instanceID = Marshal.PtrToStringAuto(detailDataBuffer);
                  Marshal.PtrToStructure(detailDataBuffer, MyDeviceInterfaceDetailData);
                  if (MyDeviceInterfaceDetailData.DevicePath.IndexOf("vid_04fa&pid_9123") != -1)       
                  {

                      Marshal.FreeHGlobal(detailDataBuffer);
                      Marshal.FreeHGlobal(DeviceInfoSet);
                      return true;
                  }
                MemberIndex++;
                Marshal.FreeHGlobal(detailDataBuffer);

            }
            else
            {
                //int lastError = Marshal.GetLastWin32Error();
            }
            if (MemberIndex>=16) { lastDevice = true; }


        } while (lastDevice == false);
        Marshal.FreeHGlobal(DeviceInfoSet);
        return false;


    }

我认为这个问题是由Marshaling造成的。

0 个答案:

没有答案