xj qian
2024-06-27 8c33d0b44a5407d6bd40df767968ce3c49cb60d5
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#pragma once
 
#include "system/base.hpp"
#include "win.hpp"
 
#define CALLBACK    __stdcall
#define MAX_PATH    260
typedef unsigned short WORD;
typedef unsigned int UINT;
typedef char CHAR;
typedef unsigned char BYTE;
typedef wchar_t WCHAR;
typedef void* HANDLE;
typedef const char* LPCSTR;
typedef void* LPVOID;
typedef DWORD* LPDWORD;
typedef const void* LPCVOID;
 
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;
 
typedef struct _OVERLAPPED {
    ULONG_PTR Internal;
    ULONG_PTR InternalHigh;
    union {
        struct {
            DWORD Offset;
            DWORD OffsetHigh;
        } DUMMYSTRUCTNAME;
        LPVOID Pointer;
    } DUMMYUNIONNAME;
 
    HANDLE  hEvent;
} OVERLAPPED, * LPOVERLAPPED;
 
 
#define OFS_MAXPATHNAME 128
typedef struct _OFSTRUCT {
    BYTE cBytes;
    BYTE fFixedDisk;
    WORD nErrCode;
    WORD Reserved1;
    WORD Reserved2;
    CHAR szPathName[OFS_MAXPATHNAME];
} OFSTRUCT;
 
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º¯Êý¹Ø±ÕÕâ¸ö¾ä±ú
        HANDLE 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 
 
        int  WINAPI CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); //native from "kernel32.dll" alias "CreateFileW";
        int  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, int lpFileSizeHigh); //native from "kernel32.dll" alias "GetFileSize";
        int  WINAPI GetKeyState(HANDLE nVirtKey); //native from "user32.dll" alias "GetKeyState";
    }
}
 
class xfile
{
public:
    static bool  WINAPI GetSaveFileName(OPENFILENAMEW& OpenFileName)
    {
        return win32::GetSaveFileNameW(OpenFileName);
    }
    static bool  WINAPI GetOpenFileName(OPENFILENAMEW& SaveFileName)
    {
        return win32::GetOpenFileNameW(SaveFileName);
    }
 
    static HANDLE WINAPI FindFirstFile(const WCHAR* lpFileName, WIN32_FIND_DATAW& lpFindFileData)
    {
        return win32::FindFirstFileW(lpFileName, lpFindFileData);
    }
 
    static HANDLE WINAPI FindNextFile(HANDLE hFindFile, WIN32_FIND_DATAW& lpFindFileData)
    {
        return win32::FindNextFileW(hFindFile, lpFindFileData);
    }
    static bool  WINAPI FindClose(HANDLE hFindFile)
    {
        return win32::FindClose(hFindFile);
    }
 
    static int  WINAPI CreateFile(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
    {
        return win32::CreateFileW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
    }
 
    static int  WINAPI  OpenFile(LPCSTR lpFileName, OFSTRUCT lpReOpenBuff, UINT wStyle)
    {
        return win32::OpenFile(lpFileName, lpReOpenBuff, wStyle);
    }
    static int  WINAPI SetFilePointer(HANDLE hFile, LONG lDistanceToMove, LONG* lpDistanceToMoveHigh, DWORD dwMoveMethod)
    {
        return win32::SetFilePointer(hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod);
    }
    static int  WINAPI ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
    {
        return win32::ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
    }
    static int  WINAPI WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped)
    {
        return win32::WriteFile(hFile, lpBuffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped);
    }
    static int  WINAPI CloseHandle(HANDLE hFile)
    {
        return  win32::CloseHandle(hFile);
    }
    static int  WINAPI GetFileSize(HANDLE hFile, int lpFileSizeHigh)
    {
        return win32::GetFileSize(hFile, lpFileSizeHigh);
    }
    static int  WINAPI GetKeyState(HANDLE nVirtKey)
    {
        return win32::GetKeyState(nVirtKey);
    }
};