Приветствую.
Имеется WinAPI-функция (если быть более точным, то в данном случае это SendMessageTimeoutA), которая в качестве одного из параметров принимает аргумент типа PDWORD_PTR, который определён (по крайней мере, в моём случае — мало ли, это от каких-то макросов зависит) в заголовочном файле "basetsd.h" следующим образом:
typedef ULONG_PTR DWORD_PTR, *PDWORD_PTR;
ULONG_PTR определён как
typedef _W64 unsigned long ULONG_PTR, *PULONG_PTR;
Требуется вызвать данную функцию из кода, написанного на C++. Разумеется, все примеры в интернете пестрят вариантами с C-style кастами:
if (!SendMessageTimeoutA(
window_handle
, msg_id
, NULL
, NULL
, SMTO_ABORTIFHUNG
, 1000
, (PDWORD)&lRes
))
{
// ...
}
C-style касты, на мой взгляд, не должны быть в коде, написанном на C++, ведь специально для этих целей там были заведены операторы приведения типов. Впрочем, использовать reinterpret_cast тоже не очень-то и хочется, ведь существует прекрасный инструмент под названием boost::reinterpret_pointer_cast (boost в проекте итак используется, так что специально ради одного лишь каста подключать его не придётся). В таком случае каст примет вид
boost::reinterpret_pointer_cast<DWORD>(&lRes)
Обратите внимание, что в качестве шаблонного аргумента здесь используется уже не PDWORD, как это было в случае C-style каста, а DWORD. PDWORD определён как
typedef DWORD near *PDWORD;
near, по идее, это "пустой" макрос:
#define near
К чему я веду? К тому, что от изначального PDWORD_PTR мы пришли аж к DWORD*, который, казалось бы, абсолютно то же самое, но гадать, будет ли при каких-то обстоятельствах он отличаться или нет — мне не очень хочется (мало ли, какие-то макросы на это влияют или ещё что-то).
Что Вы делаете в подобных случаях? Используете C-style каст и не паритесь? Делает reinterpret_cast? Используете boost::reinterpret_pointer_cast? В общем, подскажите, пожалуйста, best practices по этому поводу.