$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
Subject: Re: [boost] [Style] Import a C function with wrong signature on purpose
From: Klemens Morgenstern (klemens.morgenstern_at_[hidden])
Date: 2016-05-08 07:14:19
> It's not just a question of style. This is likely break with a recent clang. Maybe
> gcc, too. The compiler has to check that the same named functions with C
> linkage are equivalent (i.e. receive the same arguments of the same type), and
> this is not the case with enums. This is one reason why Boost.WinAPI is so
> complicated.
>
> My guess is that unless you are able to avoid enums altogether, you have no
> choice but to include windows.h. Maybe you could reduce the negative impact
> of that by providing a way to build that part of your library separately.
>
I missed the most obvious solution (I am using GetLastError because it's
shorter):
inline HANDLE_ kernel32_handle()
{
//it's a system dll, so I don't really need to clean up
static HANDLE_ h = get_module_handle("Kernel32.dll");
return h;
}
inline DWORD_ get_last_error()
{
typedef DWORD_ WINAPI (*GetLastError_t)();
static GetLastError_t p =
reinterpret_cast<GetLastError_t>
(get_proc_address(kernel32_handle(), "GetLastError"));
return (*p)();
}
I tested that directly with the winapi, the loaded address is correct.
That way I could load any function and override the enum type. I would
have few static handles here, but since they all point to system-apis I
don't think it's a problem to not clean them up (though that could be
done via unique_ptr). That would also be pure C++03, but of course
violate the current winapi style. Would that be acceptable for the
winapi by any chance?