我有一個Windows應用程序執行一個簡單的例程來確定是否存在USB令牌。該方法在32位機器上始終正常工作,但在64位機器上進行測試時,我們開始發現意外的結果。結構大小,檢查是64位還是32位
我打電話以下方法
[StructLayout(LayoutKind.Sequential)]
internal struct SP_DEVINFO_DATA
{
public Int32 cbSize;
public Guid ClassGuid;
public Int32 DevInst;
public UIntPtr Reserved;
};
[DllImport("setupapi.dll")]
internal static extern Int32 SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet, Int32 MemberIndex, ref SP_DEVINFO_DATA DeviceInterfaceData);
的說明文件SP_DEVINFO_DATA結構告訴我們,CBSIZE是 大小,以字節爲單位SP_DEVINFO_DATA結構。
如果我們計算CBSIZE對於一個32位的機這將是一個64位的機28和32。
我已經用不同的CBSIZE值重新編譯測試這兩臺機器,我想知道的是如何計算這個作爲運行?我的應用程序需要在兩種架構上運行。
internal static Int32 GetDeviceInfoData(Int32 iMemberIndex)
{
_deviceInfoData = new Win32DeviceMgmt.SP_DEVINFO_DATA
{
cbSize = ?? // 28 When 32-Bit, 32 When 64-Bit,
ClassGuid = Guid.Empty,
DevInst = 0,
Reserved = UIntPtr.Zero
};
return Win32DeviceMgmt.SetupDiEnumDeviceInfo(_deviceInfoSet, iMemberIndex, ref _deviceInfoData);
}
感謝
羅漢
漢斯,這解決了如何通過實際大小的問題,所以我upvoting。不過,我仍然有點關心包裝。沒有意義的時候通過實際的大小。 – 2010-09-21 16:56:48
@Steven - 如果包裝不正確,那麼將cbSize設置爲一個常量值實際上是一件非常糟糕的事情。它不會讓API檢測到你錯了,並報告一個很好的錯誤。它會隨機失敗,因爲它會讀取垃圾。 – 2010-09-21 17:25:48
@Hans - 歡呼聲,效果很棒! – 2010-09-21 19:46:08