2011-05-03 76 views
-1
 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; 
     } 

    } 
+2

你試過了嗎?將'hDeviceInfo'強制轉換爲32位*可能是一個問題,或者它可能沒有問題 - 它取決於SetupDiEnumDeviceInfo的作用...我懷疑你應該檢查'!= IntPtr.Zero' – 2011-05-03 05:40:33

+0

檢查結構pinvoke.net的詳細信息...我讀它應該是x64的32字節,x86的28字節 – 2011-05-03 05:52:35

回答

1

不,這不是64位安全的。儘管您的hDeviceInfo被正確定義爲IntPtr,但在比較時將其視爲32位值。

此外,您不想與IntPtr.Zero進行比較。當它失敗時,SetupDiGetClassDevs返回INVALID_HANDLE_VALUEINVALID_HANDLE_VALUE是-1。您必須比較所有64位值以確定函數是否失敗。如果您嘗試這樣的:

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

如果返回值是一樣的東西0x100000001,那你就有錯誤。您可以使用SafeHandle而不是IntPtr

+0

我完成我的應用程序開發類庫,它的作品爲32位系統,我需要部署以自由運行在64位操作系統,在哪裏不要把操作系統「SYSWOW64」位foloder請建議, – 2011-05-09 12:13:35

+0

類型鑄造IntPtr到Int32是明智的選擇? – 2011-05-09 12:15:17

+0

當您在64位平臺上運行時調用'IntPtr.ToInt32()'不是明智的選擇。 – 2011-05-09 16:12:50