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

时间:2011-05-03 05:39:14

标签: c# winapi api

        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;
        }

    }

1 个答案:

答案 0 :(得分:1)

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

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

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

如果返回的值类似于0x100000001,则会冒错误。

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