1//===- Win32/Win32.h - Common Win32 Include File ----------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines things specific to Win32 implementations. 11// 12//===----------------------------------------------------------------------===// 13 14//===----------------------------------------------------------------------===// 15//=== WARNING: Implementation here must contain only generic Win32 code that 16//=== is guaranteed to work on *all* Win32 variants. 17//===----------------------------------------------------------------------===// 18 19// mingw-w64 tends to define it as 0x0502 in its headers. 20#undef _WIN32_WINNT 21 22// Require at least Windows XP(5.1) API. 23#define _WIN32_WINNT 0x0501 24#define _WIN32_IE 0x0600 // MinGW at it again. 25#define WIN32_LEAN_AND_MEAN 26 27#include "llvm/Config/config.h" // Get build system configuration settings 28#include <windows.h> 29#include <shlobj.h> 30#include <cassert> 31#include <string> 32 33inline bool MakeErrMsg(std::string* ErrMsg, const std::string& prefix) { 34 if (!ErrMsg) 35 return true; 36 char *buffer = NULL; 37 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM, 38 NULL, GetLastError(), 0, (LPSTR)&buffer, 1, NULL); 39 *ErrMsg = prefix + buffer; 40 LocalFree(buffer); 41 return true; 42} 43 44class AutoHandle { 45 HANDLE handle; 46 47public: 48 AutoHandle(HANDLE h) : handle(h) {} 49 50 ~AutoHandle() { 51 if (handle) 52 CloseHandle(handle); 53 } 54 55 operator HANDLE() { 56 return handle; 57 } 58 59 AutoHandle &operator=(HANDLE h) { 60 handle = h; 61 return *this; 62 } 63}; 64 65template <class HandleType, uintptr_t InvalidHandle, 66 class DeleterType, DeleterType D> 67class ScopedHandle { 68 HandleType Handle; 69 70public: 71 ScopedHandle() : Handle(InvalidHandle) {} 72 ScopedHandle(HandleType handle) : Handle(handle) {} 73 74 ~ScopedHandle() { 75 if (Handle != HandleType(InvalidHandle)) 76 D(Handle); 77 } 78 79 HandleType take() { 80 HandleType temp = Handle; 81 Handle = HandleType(InvalidHandle); 82 return temp; 83 } 84 85 operator HandleType() const { return Handle; } 86 87 ScopedHandle &operator=(HandleType handle) { 88 Handle = handle; 89 return *this; 90 } 91 92 typedef void (*unspecified_bool_type)(); 93 static void unspecified_bool_true() {} 94 95 // True if Handle is valid. 96 operator unspecified_bool_type() const { 97 return Handle == HandleType(InvalidHandle) ? 0 : unspecified_bool_true; 98 } 99 100 bool operator!() const { 101 return Handle == HandleType(InvalidHandle); 102 } 103}; 104 105typedef ScopedHandle<HANDLE, uintptr_t(-1), 106 BOOL (WINAPI*)(HANDLE), ::FindClose> 107 ScopedFindHandle; 108 109namespace llvm { 110template <class T> 111class SmallVectorImpl; 112 113template <class T> 114typename SmallVectorImpl<T>::const_pointer 115c_str(SmallVectorImpl<T> &str) { 116 str.push_back(0); 117 str.pop_back(); 118 return str.data(); 119} 120} // end namespace llvm. 121