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