#pragma once #include "system/base.hpp" #include "win.hpp" #if _XWIN #define CALLBACK __stdcall #define MAX_PATH 260 typedef void* LPSECURITY_ATTRIBUTES; typedef UINT_PTR(CALLBACK* LPOFNHOOKPROC) (HWND, UINT, WPARAM, LPARAM); struct OPENFILENAMEW { DWORD lStructSize; HWND hwndOwner; HINSTANCE hInstance; LPCWSTR lpstrFilter; LPWSTR lpstrCustomFilter; DWORD nMaxCustFilter; DWORD nFilterIndex; LPWSTR lpstrFile; DWORD nMaxFile; LPWSTR lpstrFileTitle; DWORD nMaxFileTitle; LPCWSTR lpstrInitialDir; LPCWSTR lpstrTitle; DWORD Flags; WORD nFileOffset; WORD nFileExtension; LPCWSTR lpstrDefExt; LPARAM lCustData; LPOFNHOOKPROC lpfnHook; LPCWSTR lpTemplateName; void* pvReserved; DWORD dwReserved; DWORD FlagsEx; }; //FILETIME½á¹¹³ÖÓеÄ64λÎÞ·ûºÅµÄÎļþµÄÈÕÆÚºÍʱ¼äÖµ¡£Í·Îļþ: WINDEF.H struct FILETIME { int dwLowDateTime; // µÍ 32 λ int dwHighDateTime; // ¸ß 32 λ }; #if 0 struct fileinfo : public xstruct { char[128] szFileTitle; //ÎļþµÄ±êÌâÃû int dwFileAttributes; //ÎļþµÄÊôÐÔ FILETIME ftCreationTime; //ÎļþµÄ´´½¨Ê±¼ä FILETIME ftLastAccessTime; //ÎļþµÄ×îºó·ÃÎÊʱ¼ä FILETIME ftLastWriteTime; //ÎļþµÄ×îºóÐÞ¸Äʱ¼ä int nFileSizeHigh; //Îļþ´óСµÄ¸ßλ˫×Ö int nFileSizeLow; //Îļþ´óСµÄµÍλ˫×Ö int dwReserved0; //±£Áô£¬Îª0 int dwReserved1; //±£Áô£¬Îª0 }; #endif typedef struct _WIN32_FIND_DATAW { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; WCHAR cFileName[MAX_PATH]; WCHAR cAlternateFileName[14]; } WIN32_FIND_DATAW; extern "C" { //namespace win32 //{ bool WINAPI GetSaveFileNameW(OPENFILENAMEW*);//native from "comdlg32.dll" alias "GetSaveFileNameW"; bool WINAPI GetOpenFileNameW(OPENFILENAMEW*);//native from "comdlg32.dll" alias "GetOpenFileNameW"; HANDLE WINAPI FindFirstFileW(const WCHAR* lpFileName, WIN32_FIND_DATAW* lpFindFileData); //native from "kernel32.dll" alias "FindFirstFileW"; //¸ù¾ÝÎļþÃû²éÕÒÎļþ,Ò»µ©²»ÔÙÐèÒª£¬Ó¦¸ÃÓÃFindCloseº¯Êý¹Ø±ÕÕâ¸ö¾ä±ú BOOL WINAPI FindNextFileW(HANDLE hFindFile, WIN32_FIND_DATAW* lpFindFileData); //native from "kernel32.dll" alias "FindNextFileW"; //¼ÌÐø²éÕÒFindFirstFileº¯ÊýËÑË÷ºóµÄÎļþ ,HANDLE hFindFileËÑË÷µÄÎļþ¾ä±ú º¯ÊýÖ´ÐеÄʱºòËÑË÷µÄÊǴ˾ä±úµÄÏÂÒ»Îļþ¡£·ÇÁã±íʾ³É¹¦£¬Áã±íʾʧ°Ü¡£Èç²»ÔÙÓÐÓëÖ¸¶¨Ìõ¼þÏà·ûµÄÎļþ£¬»á½«GetLastErrorÉèÖóÉERROR_NO_MORE_FILES bool WINAPI FindClose(HANDLE hFindFile); //native from "kernel32.dll" alias "FindClose"; //¹Ø±ÕÓÉFindFirstFileº¯Êý´´½¨µÄÒ»¸öËÑË÷¾ä±ú¡£·µ»Ø·ÇÁã±íʾ³É¹¦£¬Áã±íʾʧ°Ü¡£»áÉèÖÃGetLastError HANDLE WINAPI CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); //native from "kernel32.dll" alias "CreateFileW"; HFILE WINAPI OpenFile(LPCSTR lpFileName, OFSTRUCT* lpReOpenBuff, UINT wStyle); //native from "kernel32.dll" alias "OpenFile"; int WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, LONG* lpDistanceToMoveHigh, DWORD dwMoveMethod); //native from "kernel32.dll" alias "SetFilePointer"; int WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); //native from "kernel32.dll" alias "ReadFile"; int WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); //native from "kernel32.dll" alias "ReadFile"; int WINAPI CloseHandle(HANDLE hFile); //native from "kernel32.dll" alias "CloseHandle"; int WINAPI GetFileSize(HANDLE hFile, DWORD* lpFileSizeHigh); //native from "kernel32.dll" alias "GetFileSize"; //} } #endif class xfile { public: static bool GetSaveFileName(OPENFILENAMEW& OpenFileName) { return ::GetSaveFileNameW(&OpenFileName); } static bool GetOpenFileName(OPENFILENAMEW& SaveFileName) { return ::GetOpenFileNameW(&SaveFileName); } static HANDLE FindFirstFile(const WCHAR* lpFileName, WIN32_FIND_DATAW& lpFindFileData) { return ::FindFirstFileW(lpFileName, &lpFindFileData); } static BOOL FindNextFile(HANDLE hFindFile, WIN32_FIND_DATAW& lpFindFileData) { return ::FindNextFileW(hFindFile, &lpFindFileData); } static bool FindClose(HANDLE hFindFile) { return ::FindClose(hFindFile); } static HANDLE CreateFile(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile) { return ::CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } static HFILE OpenFile(LPCSTR lpFileName, OFSTRUCT& lpReOpenBuff, UINT wStyle) { return ::OpenFile(lpFileName, &lpReOpenBuff, wStyle); } static int SetFilePointer(HANDLE hFile, LONG lDistanceToMove, LONG* lpDistanceToMoveHigh, DWORD dwMoveMethod) { return ::SetFilePointer(hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod); } static int ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { return ::ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); } static int WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) { return ::WriteFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped); } static int CloseHandle(HANDLE hFile) { return ::CloseHandle(hFile); } static int GetFileSize(HANDLE hFile, DWORD& lpFileSizeHigh) { return ::GetFileSize(hFile, &lpFileSizeHigh); } };