Home | History | Annotate | Download | only in base
      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.
     22 inline 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.
     34 inline 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
     41 inline 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
     48 inline LONG_PTR GetWindowLongPtrA(HWND window, int index) {
     49   return ::GetWindowLongA(window, index);
     50 }
     51 #endif  // #ifdef GetWindowLongPtrA
     52 
     53 #ifdef GetWindowLongPtrW
     54 #undef GetWindowLongPtrW
     55 inline LONG_PTR GetWindowLongPtrW(HWND window, int index) {
     56   return ::GetWindowLongW(window, index);
     57 }
     58 #endif  // #ifdef GetWindowLongPtrW
     59 
     60 #ifdef SetClassLongPtrA
     61 #undef SetClassLongPtrA
     62 inline 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
     69 inline 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