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;
}
}
答案 0 :(得分:1)
不,这不是64位安全的。虽然您的hDeviceInfo
被正确定义为IntPtr
,但在进行比较时,请将其视为32位值。
此外,您不想与IntPtr.Zero
进行比较。失败时SetupDiGetClassDevs会返回INVALID_HANDLE_VALUE
。 INVALID_HANDLE_VALUE
为-1。您必须比较值的所有64位以确定函数是否失败。如果你尝试这样的话:
if (hDeviceInfo.ToInt32() != -1)
如果返回的值类似于0x100000001,则会冒错误。
您最好的选择是使用SafeHandle而不是IntPtr
。