#include "wobject/xbase.hpp" #include "wobject/xstring.hpp" #include "win32/xfile.hpp" #include xstring xfile::GetString(xstring path) { int nLen = 0; const wchar_t* file = path.c_str(false); if (file[0] == 'f' && file[1] == 'i' && file[2] == 'l' && file[3] == 'e' && file[4] == ':' && file[5] == '/' && file[6] == '/') file += 7; BYTE* lpBuffer = xfile::GetBuffer(file, nLen); if (!lpBuffer)return L""; void* p = lpBuffer; if (nLen > 2) { if ((lpBuffer[0] == 0xff && lpBuffer[1] == 0xfe) || (lpBuffer[0] == 0xfe && lpBuffer[1] == 0xff))lpBuffer = lpBuffer + 2; } xstring str = (wchar_t*)lpBuffer; if (p)delete p; return str; } BYTE* xfile::GetBuffer(xstring path, int& Length) { TCHAR buf[255]; TCHAR* pToken = NULL; int len = 0; DWORD dwFileSize = 0; DWORD dwReadSize = 0; DWORD GENERIC_READ = (0x80000000L); DWORD GENERIC_WRITE = (0x40000000L); DWORD GENERIC_EXECUTE = (0x20000000L); DWORD GENERIC_ALL = (0x10000000L); DWORD FILE_SHARE_READ = 0x00000001; DWORD FILE_SHARE_WRITE = 0x00000002; DWORD FILE_SHARE_DELETE = 0x00000004; DWORD FILE_ATTRIBUTE_NORMAL =0x00000080; DWORD OPEN_ALWAYS = 4; DWORD OPEN_EXISTING = 3; HANDLE INVALID_HANDLE_VALUE = ((HANDLE)(LONG_PTR)-1); try { HANDLE hFile = xfile::CreateFile(path.c_str(false), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { dwFileSize = ::GetFileSize(hFile, NULL); BYTE* lpBuffer = new BYTE[dwFileSize+2]; lpBuffer[dwFileSize] = 0; lpBuffer[dwFileSize+1] = 0; ReadFile(hFile, lpBuffer, dwFileSize, &dwReadSize, NULL); Length = dwReadSize; if (hFile != INVALID_HANDLE_VALUE)CloseHandle(hFile); return lpBuffer; } } catch (...) { } return nullptr; }