fix_wp64.h revision 3345a6884c488ff3a535c2c9acdd33d74b37e311
1// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Various inline functions and macros to fix compilation of 32 bit target
6// on MSVC with /Wp64 flag enabled.
7
8#ifndef BASE_FIX_WP64_H__
9#define BASE_FIX_WP64_H__
10#pragma once
11
12#include <windows.h>
13
14// Platform SDK fixes when building with /Wp64 for a 32 bits target.
15#if !defined(_WIN64) && defined(_Wp64)
16
17#ifdef InterlockedExchangePointer
18#undef InterlockedExchangePointer
19// The problem is that the macro provided for InterlockedExchangePointer() is
20// doing a (LONG) C-style cast that triggers invariably the warning C4312 when
21// building on 32 bits.
22inline void* InterlockedExchangePointer(void* volatile* target, void* value) {
23  return reinterpret_cast<void*>(static_cast<LONG_PTR>(InterlockedExchange(
24      reinterpret_cast<volatile LONG*>(target),
25      static_cast<LONG>(reinterpret_cast<LONG_PTR>(value)))));
26}
27#endif  // #ifdef InterlockedExchangePointer
28
29#ifdef SetWindowLongPtrA
30#undef SetWindowLongPtrA
31// When build on 32 bits, SetWindowLongPtrX() is a macro that redirects to
32// SetWindowLongX(). The problem is that this function takes a LONG argument
33// instead of a LONG_PTR.
34inline LONG_PTR SetWindowLongPtrA(HWND window, int index, LONG_PTR new_long) {
35  return ::SetWindowLongA(window, index, static_cast<LONG>(new_long));
36}
37#endif  // #ifdef SetWindowLongPtrA
38
39#ifdef SetWindowLongPtrW
40#undef SetWindowLongPtrW
41inline LONG_PTR SetWindowLongPtrW(HWND window, int index, LONG_PTR new_long) {
42  return ::SetWindowLongW(window, index, static_cast<LONG>(new_long));
43}
44#endif  // #ifdef SetWindowLongPtrW
45
46#ifdef GetWindowLongPtrA
47#undef GetWindowLongPtrA
48inline LONG_PTR GetWindowLongPtrA(HWND window, int index) {
49  return ::GetWindowLongA(window, index);
50}
51#endif  // #ifdef GetWindowLongPtrA
52
53#ifdef GetWindowLongPtrW
54#undef GetWindowLongPtrW
55inline LONG_PTR GetWindowLongPtrW(HWND window, int index) {
56  return ::GetWindowLongW(window, index);
57}
58#endif  // #ifdef GetWindowLongPtrW
59
60#ifdef SetClassLongPtrA
61#undef SetClassLongPtrA
62inline LONG_PTR SetClassLongPtrA(HWND window, int index, LONG_PTR new_long) {
63  return ::SetClassLongA(window, index, static_cast<LONG>(new_long));
64}
65#endif  // #ifdef SetClassLongPtrA
66
67#ifdef SetClassLongPtrW
68#undef SetClassLongPtrW
69inline LONG_PTR SetClassLongPtrW(HWND window, int index, LONG_PTR new_long) {
70  return ::SetClassLongW(window, index, static_cast<LONG>(new_long));
71}
72#endif  // #ifdef SetClassLongPtrW
73
74#endif  // #if !defined(_WIN64) && defined(_Wp64)
75
76#endif  // BASE_FIX_WP64_H__
77