1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
|
#include "Misc.h"
#ifdef linux
#include <unistd.h>
#elif WIN32
#include <io.h>
#include <shlobj.h>
#include <shlwapi.h>
#include "System/Platform/Win/WinVersion.h"
#elif __APPLE__
#include <CoreFoundation/CoreFoundation.h>
#include <dlfcn.h> // for dladdr(), dlopen()
#include <mach-o/dyld.h>
#include <stdlib.h>
#else
#endif
namespace Platform
{
std::string GetBinaryPath()
{
#ifdef linux
std::string path(GetBinaryFile());
size_t pathlength = path.find_last_of('/');
if (pathlength != std::string::npos)
return path.substr(0, pathlength);
else
return path;
#elif WIN32
TCHAR currentDir[MAX_PATH+1];
int ret = ::GetModuleFileName(0, currentDir, sizeof(currentDir));
if (ret == 0 || ret == sizeof(currentDir))
return "";
char drive[MAX_PATH], dir[MAX_PATH], file[MAX_PATH], ext[MAX_PATH];
_splitpath(currentDir, drive, dir, file, ext);
_makepath(currentDir, drive, dir, NULL, NULL);
return std::string(currentDir);
#elif __APPLE__
uint32_t pathlen = PATH_MAX;
char path[PATH_MAX];
int err = _NSGetExecutablePath(path, &pathlen);
if (err == 0)
{
char pathReal[PATH_MAX];
realpath(path, pathReal);
return std::string(pathReal);
}
#else
return "";
#endif
}
std::string GetLibraryPath()
{
#ifdef linux
//TODO
return "";
#elif WIN32
TCHAR currentDir[MAX_PATH+1];
int ret = ::GetModuleFileName(GetModuleHandle("unitsync.dll"), currentDir, sizeof(currentDir));
if (ret == 0 || ret == sizeof(currentDir))
return "";
char drive[MAX_PATH], dir[MAX_PATH], file[MAX_PATH], ext[MAX_PATH];
_splitpath(currentDir, drive, dir, file, ext);
_makepath(currentDir, drive, dir, NULL, NULL);
return std::string(currentDir);
#elif MACOSX_BUNDLE
//TODO
return "";
#else
return "";
#endif
}
std::string GetBinaryFile()
{
#ifdef linux
char file[256];
const int ret = readlink("/proc/self/exe", file, 255);
if (ret >= 0)
{
file[ret] = '\0';
return std::string(file);
}
else
return "";
#elif WIN32
TCHAR currentDir[MAX_PATH+1];
int ret = ::GetModuleFileName(0, currentDir, sizeof(currentDir));
if (ret == 0 || ret == sizeof(currentDir))
return "";
return std::string(currentDir);
#elif MACOSX_BUNDLE
//TODO
return "";
#else
return "";
#endif
}
std::string GetOS()
{
#if defined(WIN32)
return "Microsoft Windows\n" +
GetOSDisplayString() + "\n" +
GetHardwareInfoString();
#elif defined(__linux__)
return "Linux";
#elif defined(__FreeBSD__)
return "FreeBSD";
#elif defined(__APPLE__)
return "Mac OS X";
#else
return "unknown OS";
#endif
}
bool Is64Bit()
{
return (sizeof(void*) == 8);
}
#ifdef WIN32
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
/** @brief checks if the current process is running in 32bit emulation mode
@return FALSE, TRUE, -1 on error (usually no permissions) */
bool Is32BitEmulation()
{
BOOL bIsWow64 = FALSE;
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
if (NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
return false;
}
}
return bIsWow64;
}
#else
// simply assume other OS doesn't need 32bit emulation
bool Is32BitEmulation()
{
return false;
}
#endif
}
|