You don't need to ask me a question the compiler can answer more accurately

Raymond Chen

Raymond

A customer reported having problems developing the correct
p/invoke signature for the

INPUT structure
.
“The code works on 32-bit machines, but on 64-bit machines,
the call to Send­Input returns
ERROR_INVALID_PARAMETER.”
The sample code included the lines

INPUT[] inputs = new INPUT[1];
inputs[0].type = INPUT_KEYBOARD;
...
int size = Marshal.SizeOf(inputs[0]);
if (!SendInput(1, ref inputs, size))
{
 Console.WriteLine("Failed with error {0}", GetLastError());
}

My response was simply,
“I bet you are passing the wrong structure size.
Note that on 64-bit Windows, the alignment of the inner structures
is 8-byte rather than 4-byte.
Write a C++ program that does the same thing and compare.”

The customer decided to read only the first sentence of my reply,
possibly the second, and ignore the third.
“So what size should the INPUT structure be on 64-bit
machines?”

There are a few
ways you can go about finding out the size of a structure.

One method is to ask Raymond.
This may work, but it makes Raymond rather grumpy
since it demonstrates that you are lazy and just want the answer
handed to you with no effort (or demonstration of understanding)
on your part.

Another method is to sit down with the structure definition
and work out the size on a piece of paper,
bearing in mind that various #pragma pack directives
can change how the structure packing is applied.

But the easiest way to get the size of a structure is to use
the sizeof operator, because that is after all
the method the compiler uses.
To get the same value as the C++ compiler,
just ask the C++ compiler!

#include <windows.h>
#include <stdio.h>
#include <stddef.h>
int __cdecl main(int argc, char **argv)
{
 printf("the size is %d\n", sizeof(INPUT));
 printf("the offset of mi is %d\n", offsetof(INPUT, mi));
 return 0;
}

You can now use this amazing technique to answer

wolf550e’s question
:

SSE types require 16-byte alignment.
I guess they aren’t used in the Windows SDK?
How about directX or something where they are used?

Raymond Chen
Raymond Chen

Follow Raymond