它能在64位平台上运行吗?

本文关键字:运行 平台 64位 | 更新日期: 2023-09-27 17:54:13

        var guidComPorts = Guid.Empty;
        UInt32 dwSize;
        IntPtr hDeviceInfo;
        var buffer = new byte[512];
        var providerName = new[] { };
        var spddDeviceInfo = new SpDevinfoData();
        var bStatus = SetupDiClassGuidsFromName("Ports", ref guidComPorts, 1, out dwSize);
        if (bStatus)
        {
            hDeviceInfo = SetupDiGetClassDevs(
                ref guidComPorts,
                (IntPtr)null,
                (IntPtr)null,
                DigcfPresent | DigcfProfile);
            if (hDeviceInfo.ToInt32() != 0)
            {
                while (true)
                {
                    spddDeviceInfo.CbSize = Marshal.SizeOf(spddDeviceInfo);// IS IT THIS LINE WORK FOR 64 BIT                        
                    bStatus = SetupDiEnumDeviceInfo(hDeviceInfo, nDevice++, ref spddDeviceInfo);
                    break;
                }
            }

            return;
        }
    }

它能在64位平台上运行吗?

不,这不是64位安全的。虽然您的hDeviceInfo被正确地定义为IntPtr,但在比较它时,您将其视为32位值。

同样,您也不想与IntPtr.Zero进行比较。SetupDiGetClassDevs失败时返回INVALID_HANDLE_VALUEINVALID_HANDLE_VALUE为-1。您必须比较值的所有64位,以确定函数是否失败。如果您尝试这样做:

if (hDeviceInfo.ToInt32() != -1)

如果返回值类似于0x100000001,则可能出现错误。

你最好的选择是使用SafeHandle而不是IntPtr