代码之家  ›  专栏  ›  技术社区  ›  Rohan West

结构大小,检查64位还是32位

c#
  •  3
  • Rohan West  · 技术社区  · 14 年前

    我有一个Windows应用程序,它执行一个简单的例程来确定是否存在USB令牌。该方法始终在32位计算机上正常工作,但是在64位计算机上进行测试时,我们开始看到意外的结果。

    我调用以下方法

    [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_数据结构的大小(以字节为单位)。

    如果我们计算32位机器的cbsize,64位机器的cbsize将是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);
    }
    

    谢谢

    罗翰

    4 回复  |  直到 14 年前
        1
  •  9
  •   Hans Passant    14 年前

    使用marshal.sizeof:

    _deviceInfoData = new Win32DeviceMgmt.SP_DEVINFO_DATA
        {
            cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32DeviceMgmt.SP_DEVINFO_DATA);
            // etc..
        }
    
        2
  •  1
  •   Cheng Chen    14 年前

    为什么不呢? Environment.Is64BitOperatingSystem Environment.Is64BitProcess .

        3
  •  1
  •   jcopenha    14 年前

    大小 IntPtr 32和64的更改 尝试

    cbsize = IntPtr.Size == 4 ? 28 : 32
    

    编辑:更正为intptr.size,但我喜欢hans' System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32DeviceMgmt.SP_DEVINFO_DATA); 最好是没有神奇的数字。不知道在那里。

        4
  •  0
  •   Steven Sudit    14 年前

    看起来像是对齐问题。

    尝试设置 Pack 财产。

    编辑

    我看了看: http://www.pinvoke.net/default.aspx/Structures/SP_DEVINFO_DATA.html

    它说:

    在32位平台上,所有SETUPAPI 结构是1字节压缩的。64位 SETUPAPI结构的平台 8字节打包。32位IE sp\devinfo\u data.cbsize=28,对于64位 sp devinfo_data.cbsize=(28+4)=32.sp devinfo_data.cbsize=(28+4)=32.