This is a reasonably popular question, but all the answers pretty much say: "Use IsWow64Process function". The problem with that is it returns FALSE if the application is 64-bit. I want a solution that works regardless of my app's bitness.
            Asked
            
        
        
            Active
            
        
            Viewed 2,028 times
        
    2
            
            
        - 
                    possible duplicate of [How to detect Windows 64-bit platform with .NET?](http://stackoverflow.com/questions/336633/how-to-detect-windows-64-bit-platform-with-net) – Ahmed Masud Jul 28 '13 at 17:43
- 
                    3@AhmedMasud: do you know the difference between .NET and C++ / WinAPI? – Violet Giraffe Jul 28 '13 at 17:50
- 
                    1This does fall in the category of "how can you not know". You make a very specific configuration change in your project to target x64. Making another one to define a macro is not any different and is eminently portable. Using something like sizeof(void*) in your code is not exactly a hack either, the compiler sorts this out at compile time so can optimize away chunks of code. Or use a predefined compiler macro, like _WIN64. – Hans Passant Jul 28 '13 at 17:50
- 
                    did you go read all the answers there?? there is a NON .NET C++/WinAPI answer listed in the replies to that question :P – Ahmed Masud Jul 28 '13 at 17:52
- 
                    @AhmedMasud: I don't like the answer relying on environmental variables either, they might be deleted. – Violet Giraffe Jul 28 '13 at 17:54
- 
                    Okay then I have another reference for you: http://blogs.msdn.com/b/oldnewthing/archive/2005/02/01/364563.aspx and I am retracting the close vote the issues are nicely discussed there. – Ahmed Masud Jul 28 '13 at 17:56
- 
                    1@AhmedMasud: Yep, thanks, figured it out already. Funny how I didn't realize it immediately :) – Violet Giraffe Jul 28 '13 at 18:00
- 
                    Add your answer below I'll vote it. – Ahmed Masud Jul 28 '13 at 18:01
1 Answers
5
            Create a function to call the Win32 API function IsWow64Process() for 32bit process and return true for 64bit process.
bool is_64bit(void)
{
#if defined(_WIN64)
    return true;  // 64-bit programs run only on Win64
#elif defined(_WIN32)
    BOOL f64 = FALSE;
    return IsWow64Process(GetCurrentProcess(), &f64) && f64;
#endif
}
 
    
    
        IInspectable
        
- 46,945
- 8
- 85
- 181
 
    
    
        cdmh
        
- 3,294
- 2
- 26
- 41
- 
                    2Your `#if` ... `#elif` ... `#endif` does not contain an `#else` clause. Is this intentional? In this particular case the compiler will issue an error if none of the preprocessor symbols are defined. In general I prefer to be explicit and use an `#error` preprocessor directive in cases like this. – IInspectable Aug 07 '13 at 15:49
