I am getting the same sizeof values for x64 and x32,
(although I am getting correct individual parameter size values e.g. for HICON 8/4 (x64/x32),)
which suggests that the x64 exe is using x32 alignment rules:
NOTE: I think I'm starting to understand 1/2/4/8-byte structs, but sizes like 3/6/10/16 are presenting further difficulties (see the code at the bottom).
[updated: 2017-01-23]
EXAMPLE STRUCT SIZES WHEN PARAMETERS OF SPECIFIC SIZES ARE CHOSEN
with a C++ code example
e.g.
CHAR (1), SHORT (2), INT (4), INT64 (8),
ITEMIDLIST (3), ACCEL (6), PANOSE (10), RECT (16)
Code: Select all
==================================================
e.g. C++ code (cpp code):
#define UNICODE 1
#include <iostream>
#include <windows.h>
#include <Winuser.h>
// #include <CommCtrl.h>
// #include <Richedit.h>
#include <Shlwapi.h>
// #include <WinInet.h>
// #include <TlHelp32.h>
// #include <ShlObj.h>
// #include <DbgHelp.h>
// #include <In6addr.h>
struct MYSTRUCT {
CHAR v1;
SHORT v2;
INT v3;
INT64 v4;
RECT v5;
};
int main()
{
std::cout << sizeof(MYSTRUCT) << std::endl;
return 0;
}
==================================================
;alignment and padding for structs in x32
1 CHAR [1]
2 SHORT [2]
4 INT [4]
8 INT64 [8]
3 ITEMIDLIST [3] ;#include <Shlwapi.h>
6 ACCEL [6]
10 PANOSE [10]
16 RECT [16]
==================================================
3 CHAR CHAR CHAR [1 1 1]
4 SHORT CHAR [2 1(+1)]
4 SHORT CHAR CHAR [2 1 1]
6 SHORT CHAR SHORT [2 1(+1) 2]
4 CHAR SHORT [1(+1) 2]
6 CHAR SHORT CHAR [1(+1) 2 1(+1)]
20 INT INT INT INT INT [4 4 4 4 4]
24 INT INT INT INT INT CHAR [4 4 4 4 4 1(+3)]
24 INT INT INT INT INT CHAR CHAR CHAR CHAR [4 4 4 4 4 1 1 1 1]
28 INT INT INT INT INT CHAR CHAR CHAR CHAR CHAR [4 4 4 4 4 1 1 1 1 1(+3)]
16 INT INT64 [4(+4) 8]
24 INT INT64 INT64 [4(+4) 8 8]
16 INT64 INT [8 4(+4)]
24 INT64 INT INT64 [8 4(+4) 8]
16 INT64 INT INT [8 4 4]
16 CHAR SHORT INT INT64 [1(+1) 2 4 8]
16 INT64 INT SHORT CHAR [8 4 2 1(+1)]
==================================================
20 INT RECT [4 16]
24 INT RECT INT [4 16 4]
28 INT RECT INT INT [4 16 4 4]
32 INT RECT INT INT INT [4 16 4 4 4]
36 INT RECT INT INT INT INT [4 16 4 4 4 4]
32 INT RECT INT64 [4(+4) 16 8]
40 INT RECT INT64 INT64 [4(+4) 16 8 8]
48 INT RECT INT64 INT64 INT [4(+4) 16 8 8 4(+4)]
48 INT RECT INT64 INT64 INT INT [4(+4) 16 8 8 4 4]
48 INT RECT INT64 INT64 INT64 [4(+4) 16 8 8 8]
24 INT64 RECT [8 16]
24 RECT INT64 [16 8]
32 CHAR SHORT INT INT64 RECT [1(+1) 2 4 8 16]
32 RECT INT64 INT SHORT CHAR [16 8 4 2 1(+1)]
==================================================
2 CHAR CHAR [1 1]
4 SHORT CHAR [2 1(+1)]
4 ITEMIDLIST CHAR [3 1]
8 INT CHAR [4 1(+3)]
8 ACCEL CHAR [6 1(+1)] ACCEL wants overall struct size 2n?
16 INT64 CHAR [8 1(+7)]
11 PANOSE CHAR [10 1] PANOSE wants overall struct size n?
20 RECT CHAR [16 1(+3)] RECT wants overall struct size 4n?
4 CHAR SHORT [1(+1) 2]
4 SHORT SHORT [2 2]
6 ITEMIDLIST SHORT [3(+1) 2]
8 INT SHORT [4 2(+2)]
8 ACCEL SHORT [6 2]
16 INT64 SHORT [8 2(+6)]
12 PANOSE SHORT [10 2]
20 RECT SHORT [16 2(+2)] RECT wants overall struct size 4n?
4 CHAR ITEMIDLIST [1 3]
6 SHORT ITEMIDLIST [2 3(+1)]
6 ITEMIDLIST ITEMIDLIST [3 3]
8 INT ITEMIDLIST [4 3(+1)]
10 ACCEL ITEMIDLIST [6 3(+1)] ACCEL wants overall struct size 2n?
16 INT64 ITEMIDLIST [8 3(+5)]
13 PANOSE ITEMIDLIST [10 3]
20 RECT ITEMIDLIST [16 3(+1)] RECT wants overall struct size 4n?
8 CHAR INT [1(+3) 4]
8 SHORT INT [2(+2) 4]
8 ITEMIDLIST INT [3(+1) 4]
8 INT INT [4 4]
12 ACCEL INT [6(+2) 4]
16 INT64 INT [8 4(+4)]
16 PANOSE INT [10(+2) 4]
20 RECT INT [16 4]
8 CHAR ACCEL [1(+1) 6] ACCEL wants start 2n?
8 SHORT ACCEL [2 6]
10 ITEMIDLIST ACCEL [3(+1) 6]
12 INT ACCEL [4 6(+2)]
12 ACCEL ACCEL [6 6]
16 INT64 ACCEL [8 6(+2)]
16 PANOSE ACCEL [10 6]
24 RECT ACCEL [16 6(+2)]
16 CHAR INT64 [1(+7) 8]
16 SHORT INT64 [2(+6) 8]
16 ITEMIDLIST INT64 [3(+5) 8]
16 INT INT64 [4(+4) 8]
16 ACCEL INT64 [6(+2) 8]
16 INT64 INT64 [8 8]
24 PANOSE INT64 [10(+6) 8]
24 RECT INT64 [16 8]
11 CHAR PANOSE [1 10] PANOSE wants start n?
12 SHORT PANOSE [2 10]
13 ITEMIDLIST PANOSE [3 10]
16 INT PANOSE [4 10(+2)]
16 ACCEL PANOSE [6 10]
24 INT64 PANOSE [8 10(+6)]
20 PANOSE PANOSE [10 10]
28 RECT PANOSE [16 10(+2)]
20 CHAR RECT [1(+3) 16]
20 SHORT RECT [2(+2) 16]
20 ITEMIDLIST RECT [3(+1) 16]
20 INT RECT [4 16]
24 ACCEL RECT [6(+2) 16]
24 INT64 RECT [8 16]
28 PANOSE RECT [10(+2) 16]
32 RECT RECT [16 16]
==================================================
[lots of struct details]
Structure.htm
http://tokovalue.jp/Structure.htm
[lots of struct/parameter names]
winwords.txt
http://katahiromz.web.fc2.com/win32/winwords.txt
[EDIT]
Please see my previous post which considers:
c++ - Why does the structure size differ in 32-bit and 64-bit program? - Stack Overflow
http://stackoverflow.com/questions/2783 ... it-program
Windows aligns doubles on 8 byte boundaries, even on 32 bit machines.
c++ - Double alignment - Stack Overflow
http://stackoverflow.com/questions/1110 ... -alignment
Windows uses 64-bit alignment of double values even in 32-bit mode