Skip to content

Commit

Permalink
Fixed MCGRIDINFO definition
Browse files Browse the repository at this point in the history
to get correct data from WinAPI messages
Fixes Issue #2912
Related Issue #2475
Related PR #2975
  • Loading branch information
vladimir-krestov committed Mar 23, 2020
1 parent 0e265d8 commit 8c3830f
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

namespace System
{
public static class ArchitectureDetection
{
public static bool Is32bit => IntPtr.Size == 4;
public static bool Is64bit => IntPtr.Size == 8;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ public unsafe struct MCGRIDINFO
public int iCalendar;
public int iRow;
public int iCol;
public bool bSelected;
public BOOL bSelected;
public Kernel32.SYSTEMTIME stStart;
public Kernel32.SYSTEMTIME stEnd;
public RECT rc;
public char* pszName;
public uint cchName;
public UIntPtr cchName;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.Runtime.InteropServices;
using Xunit;
using static Interop.ComCtl32;

namespace System.Windows.Forms.Primitives.Tests.Interop.ComCtl32
{
public class MCGRIDINFOTests : IClassFixture<ThreadExceptionFixture>
{
[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))]
public unsafe void MCGRIDINFO_x32_Size()
{
Assert.Equal(84, sizeof(MCGRIDINFO));
}

[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))]
public unsafe void MCGRIDINFO_x32_Marshal_Size()
{
Assert.Equal(84, Marshal.SizeOf<MCGRIDINFO>());
}

[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))]
public unsafe void MCGRIDINFO_x32_ensure_layout()
{
MCGRIDINFO sut = new MCGRIDINFO();
byte* addr = (byte*)&sut;

Assert.Equal(0, (byte*)&sut.cbSize - addr); // 4, UINT
Assert.Equal(4, (byte*)&sut.dwPart - addr); // 4, DWORD
Assert.Equal(8, (byte*)&sut.dwFlags - addr); // 4, DWORD
Assert.Equal(12, (byte*)&sut.iCalendar - addr); // 4, int
Assert.Equal(16, (byte*)&sut.iRow - addr); // 4, int
Assert.Equal(20, (byte*)&sut.iCol - addr); // 4, int
Assert.Equal(24, (byte*)&sut.bSelected - addr); // 4, BOOL
Assert.Equal(28, (byte*)&sut.stStart - addr); // 16, SYSTEMTIME
Assert.Equal(44, (byte*)&sut.stEnd - addr); // 16, SYSTEMTIME
Assert.Equal(60, (byte*)&sut.rc - addr); // 16, RECT
Assert.Equal(76, (byte*)&sut.pszName - addr); // 4, PWSTR
Assert.Equal(80, (byte*)&sut.cchName - addr); // 4, size_t
}

[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))]
public void MCGRIDINFO_x32_Marshal_OffsetOf_IsCorrect()
{
Assert.Equal(0, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.cbSize))); // 4, UINT
Assert.Equal(4, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.dwPart))); // 4, DWORD
Assert.Equal(8, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.dwFlags))); // 4, DWORD
Assert.Equal(12, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.iCalendar))); // 4, int
Assert.Equal(16, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.iRow))); // 4, int
Assert.Equal(20, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.iCol))); // 4, int
Assert.Equal(24, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.bSelected))); // 4, BOOL
Assert.Equal(28, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.stStart))); // 16, SYSTEMTIME
Assert.Equal(44, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.stEnd))); // 16, SYSTEMTIME
Assert.Equal(60, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.rc))); // 16, RECT
Assert.Equal(76, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.pszName))); // 8, PWSTR
Assert.Equal(80, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.cchName))); // 8, size_t
}

[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))]
public unsafe void MCGRIDINFO_x64_Size()
{
Assert.Equal(96, sizeof(MCGRIDINFO));
}

[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))]
public void MCGRIDINFO_x64_Marshal_Size()
{
Assert.Equal(96, Marshal.SizeOf<MCGRIDINFO>());
}

private bool a = ArchitectureDetection.Is64bit;

[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))]
public unsafe void MCGRIDINFO_x64_ensure_layout()
{
MCGRIDINFO sut = new MCGRIDINFO();
byte* addr = (byte*)&sut;

Assert.Equal(0, (byte*)&sut.cbSize - addr); // 4, UINT
Assert.Equal(4, (byte*)&sut.dwPart - addr); // 4, DWORD
Assert.Equal(8, (byte*)&sut.dwFlags - addr); // 4, DWORD
Assert.Equal(12, (byte*)&sut.iCalendar - addr); // 4, int
Assert.Equal(16, (byte*)&sut.iRow - addr); // 4, int
Assert.Equal(20, (byte*)&sut.iCol - addr); // 4, int
Assert.Equal(24, (byte*)&sut.bSelected - addr); // 4, BOOL
Assert.Equal(28, (byte*)&sut.stStart - addr); // 16, SYSTEMTIME
Assert.Equal(44, (byte*)&sut.stEnd - addr); // 16, SYSTEMTIME
Assert.Equal(60, (byte*)&sut.rc - addr); // 16, RECT
// 4 bytes alignment 76 -> 80
Assert.Equal(80, (byte*)&sut.pszName - addr); // 8, PWSTR
Assert.Equal(88, (byte*)&sut.cchName - addr); // 8, size_t
}

[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))]
public void MCGRIDINFO_x64_Marshal_OffsetOf_IsCorrect()
{
Assert.Equal(0, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.cbSize))); // 4, UINT
Assert.Equal(4, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.dwPart))); // 4, DWORD
Assert.Equal(8, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.dwFlags))); // 4, DWORD
Assert.Equal(12, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.iCalendar))); // 4, int
Assert.Equal(16, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.iRow))); // 4, int
Assert.Equal(20, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.iCol))); // 4, int
Assert.Equal(24, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.bSelected))); // 4, BOOL
Assert.Equal(28, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.stStart))); // 16, SYSTEMTIME
Assert.Equal(44, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.stEnd))); // 16, SYSTEMTIME
Assert.Equal(60, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.rc))); // 16, RECT
// 4 bytes alignment 76 -> 80
Assert.Equal(80, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.pszName))); // 8, PWSTR
Assert.Equal(88, (int)Marshal.OffsetOf<MCGRIDINFO>(nameof(MCGRIDINFO.cchName))); // 8, size_t
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,13 @@ namespace System.Windows.Forms.Primitives.Tests.Interop.Comdlg32
{
public class PRINTDLGWTests : IClassFixture<ThreadExceptionFixture>
{
public static bool Is32bit => IntPtr.Size == 4;
public static bool Is64bit => IntPtr.Size == 8;

[ConditionalFact(nameof(Is32bit))]
[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))]
public unsafe void PRINTDLGW_32_Size()
{
Assert.Equal(66, sizeof(PRINTDLGW_32));
}

[ConditionalFact(nameof(Is32bit))]
[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is32bit))]
public unsafe void PRINTDLGW_32_ensure_layout()
{
PRINTDLGW_32 sut = new PRINTDLGW_32();
Expand All @@ -46,13 +43,13 @@ public unsafe void PRINTDLGW_32_ensure_layout()
Assert.Equal(62, (byte*)&sut._hSetupTemplate - addr); // 4, HGLOBAL
}

[ConditionalFact(nameof(Is64bit))]
[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))]
public unsafe void PRINTDLGW_64_Size()
{
Assert.Equal(120, sizeof(PRINTDLGW_64));
}

[ConditionalFact(nameof(Is64bit))]
[ConditionalFact(typeof(ArchitectureDetection), nameof(ArchitectureDetection.Is64bit))]
public unsafe void PRINTDLGW_64_ensure_layout()
{
PRINTDLGW_64 sut = new PRINTDLGW_64();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -520,7 +520,7 @@ private unsafe bool GetCalendarGridInfoText(MCGIP dwPart, int calendarIndex, int
iCol = column,
iRow = row,
pszName = pName,
cchName = (uint)name.Length - 1
cchName = (UIntPtr)name.Length - 1
};

result = User32.SendMessageW(_owner, (User32.WM)MCM.GETCALENDARGRIDINFO, IntPtr.Zero, ref gridInfo) != IntPtr.Zero;
Expand Down

0 comments on commit 8c3830f

Please sign in to comment.