RFC: Should we use the macros in windowsx.h to fix -DSTRICT w arni ngs?

Alexandre Julliard julliard at winehq.com
Sat Aug 11 12:17:27 CDT 2001

Patrik Stridvall <ps at leissner.se> writes:

> We can just do it like:
> #ifdef __GNUC__
> extern inline void FORWARD_WM_COMMAND(HWND hwnd, int id, HWND hwndCtl, UINT
> codeNotify, WNDPROC fn)
> {
>    fn(hwnd, WM_COMMAND, MAKEWPARAM(id, codeNotify), (LPARAM) hwnd);
> }
> #else
> #define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn) \
>             (void)(fn)((hwnd), WM_COMMAND,
> MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))
> #endif
> if you wish. And if you are worried about preprocessor abusing 
> Winelib application we could do #if defined(__GNUC__) && defined(__WINE__)
> instead or use some kind of macro wrap around protection of the
> kind that I proposed that you didn't like.

If you want to wrap WM_COMMAND, do something like:

inline void send_wm_command(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
   SendMessageW(hwnd, WM_COMMAND, MAKEWPARAM(id, codeNotify), (LPARAM)hwndCtl);

This is a normal function, doing a normal SendMessage call, and it's
perfectly all right with me. And if you want to do a PostMessage then
write a separate post_wm_command() function. Of course this is not a
standard Windows API so you cannot put it in the standard header
files; but you can have it in some dll private headers, or even
directly in the C files that need it.

> To sum it up:
> 1. The FORWARD_* API and the HANDLE_* API really are normal functions not
>    macros (preprocessor abuses). The fact Micrsoft implemented them as macros
>    because of lack of compiler support for inline functions or because of
>    incompetence is irrelevant, we can do it right in a 100% compatible way.

No we can't; SendMessage and PostMessage don't have the same
prototype, so the preprocessor abuse is necessary to avoid

Alexandre Julliard
julliard at winehq.com

More information about the wine-devel mailing list