Способен ли он работать на 64-битной платформе? - PullRequest
0 голосов
/ 03 мая 2011
        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 Ответ

1 голос
/ 03 мая 2011

Нет, это не 64-битный сейф. Хотя ваш hDeviceInfo правильно определен как IntPtr, вы сравниваете его как 32-битное значение при сравнении.

Кроме того, вы не хотите сравнивать с IntPtr.Zero. SetupDiGetClassDevs возвращает INVALID_HANDLE_VALUE в случае сбоя. INVALID_HANDLE_VALUE равно -1. Вы должны сравнить все 64 бита значения, чтобы определить, не сработала ли функция. Если вы попробуете что-то вроде:

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

Тогда вы рискуете ошибкой, если возвращаемое значение равно 0x100000001.

Лучше всего использовать SafeHandle вместо IntPtr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...