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位安全的。儘管您的hDeviceInfo
被正確定義爲IntPtr
,但在比較時將其視爲32位值。
此外,您不想與IntPtr.Zero
進行比較。當它失敗時,SetupDiGetClassDevs返回INVALID_HANDLE_VALUE
。 INVALID_HANDLE_VALUE
是-1。您必須比較所有64位值以確定函數是否失敗。如果您嘗試這樣的:
if (hDeviceInfo.ToInt32() != -1)
如果返回值是一樣的東西0x100000001,那你就有錯誤。您可以使用SafeHandle而不是IntPtr
。
我完成我的應用程序開發類庫,它的作品爲32位系統,我需要部署以自由運行在64位操作系統,在哪裏不要把操作系統「SYSWOW64」位foloder請建議, – 2011-05-09 12:13:35
類型鑄造IntPtr到Int32是明智的選擇? – 2011-05-09 12:15:17
當您在64位平臺上運行時調用'IntPtr.ToInt32()'不是明智的選擇。 – 2011-05-09 16:12:50
- 1. 在64位平臺上運行的32位彙編代碼
- 2. 在64位Windows平臺上運行PHP - 問題?
- 3. 並不在64位平臺上運行適當
- 4. Numpy.count_nonzero在64位Windows平臺上崩潰
- 5. COM在64位平臺
- 6. NativeSwing在32位平臺上運行
- 7. 在64位Windows平臺上運行32位Delphi應用程序的問題
- 8. jmvfw.dll:不能AMD 64位平臺上加載IA 32位的.dll
- 9. 我怎樣才能在64位平臺上
- 10. ListView CustomDraw不能在64位平臺上工作
- 11. 編程爲64位平臺
- 12. 在32位和64位平臺上總是處理32位?
- 13. 在32位或64位matlab上運行?
- 14. 我可以在32位機器上運行64位dll嗎?
- 15. 能夠從任何平臺
- 16. Facebook支付平臺在32位服務器上的64位order_id
- 17. webots - 無法在AMD 64位平臺上加載IA 32位.dll
- 18. 針對`.rodata'重新定位R_X86_64_32S ...在64位平臺上編譯
- 19. gcc:在32位平臺上編譯64位二進制文件
- 20. 無法在IA 32位平臺上加載AMD 64位.dll
- 21. 無法在AMD 64位平臺上加載IA 32位.DLL LWJGL
- 22. 無法在AMD 64位平臺上加載IA 32位.dll
- 23. 在32位和64位平臺上安裝組件
- 24. 無法在IA 32位平臺上加載AMD 64位.dll
- 25. CMake在64位平臺上查找32位GDI +
- 26. 構建32位OpenCV的64位平臺
- 27. PHP的32位和64位平臺
- 28. 能夠在Android WebView中運行chrome嗎?
- 29. 在64位LInux上運行Eclipse 64位的問題RHEL5
- 30. 如何在64位Windows上運行Perforce?
你試過了嗎?將'hDeviceInfo'強制轉換爲32位*可能是一個問題,或者它可能沒有問題 - 它取決於SetupDiEnumDeviceInfo的作用...我懷疑你應該檢查'!= IntPtr.Zero' – 2011-05-03 05:40:33
檢查結構pinvoke.net的詳細信息...我讀它應該是x64的32字節,x86的28字節 – 2011-05-03 05:52:35