WinAPI/WinAPI.mqh

193 lines
21 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:36:16 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| WinAPI.mqh |
//| Copyright <EFBFBD> 2018, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright <00> 2018, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.001"
#include "WinAPIErrorsDescription.mqh"
//---
#import "kernel32.dll"
int GetLastError();
/*
CreateDirectoryW
0@0<5B@K
lpPathName [in]
CBL ?0?:8, :>B>@0O 1C45B A>740=0
lpSecurityAttributes [in, optional]
!AK;:0 =0 AB@C:BC@C >?8AK20NI8CN 157>?0AB=>ABL ?0?:8. @>AB> ?5@540Q< "0".
>72@0I05<>5 7=0G5=85
A;8 DC=:F8O 7025@H05BAO CA?5H=>, B> 2>72@0I05<>5 7=0G5=85 =5 @02=> =C;N.
A;8 DC=:F8O 7025@H05BAO >H81:>9, 2>72@0I05<>5 7=0G5=85 @02=> =C;N. 'B>1K ?>;CG8BL @0AH8@5==CN 8=D>@<0F8N
>1 >H81:5, 2K7>28B5 DC=:F8N kernel32::GetLastError(). >7<>6=K5 >H81:8:
ERROR_ALREADY_EXISTS
ERROR_PATH_NOT_FOUND
*/
bool CreateDirectoryW(string &lpPathName,long lpSecurityAttributes=0);
/*
CopyFileW
0@0<5B@K
lpExistingFileName [in]
<O ACI5AB2CNI53> D09;0.
45AL ?@8=C48B5;L=> ?@8=OB> >3@0=8G5=85 ?> 4;8=5 8<5=8  MAX_PATH A8<2>;>2, MB>3> 2A5340 E20B8B 4;O =0H53> ?@8<5@0.
A;8 D09; A 8<5=5< lpExistingFileName =5 ACI5AB2C5B, B> DC=:F8O B5@?8B =5C40GC,
8 kernel32::GetLastError() 2>72@0I05B ERROR_FILE_NOT_FOUND.
lpNewFileName [in]
<O =>2>3> D09;0.
45AL ?@8=C48B5;L=> ?@8=OB> >3@0=8G5=85 ?> 4;8=5 8<5=8  MAX_PATH A8<2>;>2, MB>3> 2A5340 E20B8B 4;O =0H53> ?@8<5@0.
bFailIfExists [in]
A;8 MB>B ?0@0<5B@ true 8 =>2K9 D09;, C:070==K9 2 lpNewFileName ACI5AB2C5B, DC=:F8O B5@?8B =5C40GC.
A;8 MB>B ?0@0<5B@ false 8 =>2K9 D09; ACI5AB2C5B, DC=:F8O ?5@5?8H5B ACI5AB2CNI89 D09; 8 CA?5H=> 7025@H8B @01>BC.
>72@0I05<>5 7=0G5=85
A;8 DC=:F8O 7025@H05BAO CA?5H=>, B> 2>72@0I05<>5 7=0G5=85 =5 @02=> =C;N.
A;8 DC=:F8O 7025@H05BAO >H81:>9, 2>72@0I05<>5 7=0G5=85 @02=> =C;N. 'B>1K ?>;CG8BL 4>?>;=8B5;L=CN 8=D>@<0F8N
>1 >H81:5, 2K7>28B5 DC=:F8N kernel32::GetLastError(). >7<>6=K5 >H81:8:
ERROR_FILE_NOT_FOUND
*/
int CopyFileW(string lpExistingFileName,string lpNewFileName,bool bFailIfExists);
int FindClose(int hFindFile);
int FindClose(long hFindFile);
/*
CreateFileW
0@0<5B@K
lpFileName
<O D09;0 8;8 CAB@>9AB20, :>B>@>5 1C45B A>740=> 8;8 >B:@KB>.
K <>65B5 8A?>;L7>20BL ;81> :>ACN G5@BC (/), ;81> >1@0B=CN :>ACN G5@BC () 2 MB>< 8<5=8.
dwDesiredAccess
0?@>H5==K9 4>ABC? : D09;C 8;8 CAB@>9AB2C, :>B>@K9 <>6=> AC<<8@>20BL :0: GB5=85, 70?8AL, >10 8;8.
<EFBFBD><EFBFBD><EFBFBD> 081>;55 G0AB> 8A?>;L7C5<K5 7=0G5=8O: GENERIC_READ, GENERIC_WRITE 8;8 >10 (GENERIC_READ|GENERIC_WRITE).
dwShareMode
0?@>H5==K9 @568< A>2<5AB=>3> 4>ABC?0 : D09;C 8;8 CAB@>9AB2C, :>B>@K9 <>6=> G8B0BL, 70?8AK20BL, G8B0BL 8 70?8AK20BL,
C40;OBL, ;N1>9 87 =8E (A<. !;54CNICN B01;8FC). -B>B 70?@>A =5 2;8O5B =0 70?@>AK 4>ABC?0 : 0B@81CB0<
8;8 @0AH8@5==K< 0B@81CB0<.
0 hex 0x00000000 0?@5I05B 4@C38< ?@>F5AA0< >B:@K20BL D09; 8;8 CAB@>9AB2>,
5A;8 >=8 70?@0H820NB C40;5=85, GB5=85 8;8 70?8AL.
FILE_SHARE_DELETE hex 0x00000004 :;NG05B ?>A;54CNI85 >?5@0F88 >B:@KB>3> 4>ABC?0 : D09;C
8;8 CAB@>9AB2C 4;O 70?@>A0 4>ABC?0 =0 C40;5=85.
FILE_SHARE_READ hex 0x00000001 :;NG05B ?>A;54CNI85 >?5@0F88 >B:@KB>3> 4>ABC?0 : D09;C
8;8 CAB@>9AB2C 4;O 70?@>A0 4>ABC?0 =0 GB5=85.
FILE_SHARE_WRITE hex 0x00000002 :;NG05B ?>A;54CNI85 >?5@0F88 >B:@KB>3> 4>ABC?0 : D09;C
8;8 CAB@>9AB2C 4;O 70?@>A0 4>ABC?0 =0 70?8AL.
lpSecurityAttributes
#:070B5;L =0 AB@C:BC@C SECURITY_ATTRIBUTES, :>B>@0O A>45@68B 420 >B45;L=KE, => A2O70==KE M;5<5=B0 40==KE:
=5>1O70B5;L=K9 45A:@8?B>@ 157>?0A=>AB8 8 ;>38G5A:>5 7=0G5=85, >?@545;ONI55, <>65B ;8
2>72@0I5==K9 45A:@8?B>@ =0A;54>20BLAO 4>G5@=8<8 ?@>F5AA0<8.
-B>B ?0@0<5B@ <>65B 1KBL NULL.
dwCreationDisposition
59AB285, :>B>@>5 B@51C5BAO 4;O A>740=8O D09;0 8;8 CAB@>9AB20, :>B>@>5 ACI5AB2C5B 8;8 =5 ACI5AB2C5B.
;O 4@C38E CAB@>9AB2, :@><5 D09;>2, MB>B ?0@0<5B@ >1KG=> CAB0=02;8205BAO =0 OPEN_EXISTING.
CREATE_ALWAYS 2 !>7405B =>2K9 D09;, 2A5340. A;8 C:070==K9 D09; ACI5AB2C5B 8 4>ABC?5= 4;O 70?8A8,
DC=:F8O ?5@570?8AK205B D09;, DC=:F8O CA?5H=> 7025@H05BAO,
0 :>4 ?>A;54=59 >H81:8 - ERROR_ALREADY_EXISTS (183).
CREATE_NEW 1 !>7405B =>2K9 D09;, B>;L:> 5A;8 >= 5I5 =5 ACI5AB2C5B. A;8 C:070==K9 D09;
ACI5AB2C5B, DC=:F8O 7025@H05BAO A >H81:>9,
0 :>4 ?>A;54=59 >H81:8 - ERROR_FILE_EXISTS (80).
OPEN_ALWAYS 4 B:@K205B D09; 2A5340. A;8 C:070==K9 D09; ACI5AB2C5B,
DC=:F8O 7025@H05BAO CA?5H=>, 0 :>4 ?>A;54=59 >H81:8 - ERROR_ALREADY_EXISTS (183).
OPEN_EXISTING 3 B:@K205B D09; 8;8 CAB@>9AB2>, B>;L:> 5A;8 >= ACI5AB2C5B. A;8 C:070==K9 D09;
8;8 CAB@>9AB2> =5 ACI5AB2C5B, DC=:F8O 7025@H05BAO A >H81:>9,
0 :>4 ?>A;54=59 >H81:8 - ERROR_FILE_NOT_FOUND (2).
TRUNCATE_EXISTING 5 B:@K205B D09; 8 >1@5705B 53> B0:, GB> 53> @07<5@ @025= =C;N 109B0<,
B>;L:> 5A;8 >= ACI5AB2C5B. A;8 C:070==K9 D09; =5 ACI5AB2C5B,
DC=:F8O 7025@H05BAO A >H81:>9, 0 :>4 ?>A;54=59 >H81:8 - ERROR_FILE_NOT_FOUND (2).
dwFlagsAndAttributes
B@81CBK 8 D;038 D09;0 8;8 CAB@>9AB20, FILE_ATTRIBUTE_NORMAL - =081>;55 @0A?@>AB@0=5==>5 7=0G5=85 ?> C<>;G0=8N 4;O D09;>2.
FILE_ATTRIBUTE_NORMAL dec 128 hex 0x80 # D09;0 =5B 4@C38E 0B@81CB>2. -B>B 0B@81CB 459AB28B5;5= B>;L:> 2 B>< A;CG05, 5A;8 >= 8A?>;L7C5BAO >48=.
FILE_ATTRIBUTE_READONLY dec 1 hex 0x1 $09; 4>ABC?5= B>;L:> 4;O GB5=8O. @8;>65=8O <>3CB G8B0BL D09;, => =5 <>3CB 53> 70?8A0BL 8;8 C40;8BL.
hTemplateFile
@028;L=K9 45A:@8?B>@ D09;0 H01;>=0 A ?@02>< 4>ABC?0 GENERIC_READ. $09; H01;>=0 ?@54>AB02;O5B 0B@81CBK D09;>2
8 @0AH8@5==K5 0B@81CBK 4;O A>740205<>3> D09;0.
-B>B ?0@0<5B@ <>65B 1KBL NULL.
>72@0I05<>5 7=0G5=85
A;8 DC=:F8O 7025@H05BAO CA?5H=>, 2>72@0I05<>5 7=0G5=85 O2;O5BAO >B:@KBK< 45A:@8?B>@>< 4;O C:070==>3> D09;0,
CAB@>9AB20, 8<5=>20==>3> :0=0;0 8;8 ?>GB>2>3> A;>B0.
A;8 DC=:F8O =5 @01>B05B, 2>72@0I05BAO 7=0G5=85 INVALID_HANDLE_VALUE. 'B>1K ?>;CG8BL @0AH8@5==CN 8=D>@<0F8N
>1 >H81:5, 2K7>28B5 GetLastError.
*/
int CreateFileW(
HANDLE CreateFileW(string lpFileName,
LPCWSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
#import
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool WinAPI_FindClose(long hFindFile)
{
bool res;
if(_IsX64)
res=FindClose(hFindFile)!=0;
else
res=FindClose((int)hFindFile)!=0;
if(!res)
ErrorDescription(kernel32::GetLastError());
//---
return(res);
}
//+------------------------------------------------------------------+
//| CreateDirectory function |
//| https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa363855(v=vs.85).aspx |
//| Return code: |
//| ERROR_ALREADY_EXISTS |
//| 183 (0xB7) |
//| Cannot create a file when that file already exists |
//| ERROR_PATH_NOT_FOUND |
//| 3 (0x3) |
//| The system cannot find the path specified |
//+------------------------------------------------------------------+
bool WinAPI_CreateDirectory(int &error,string &lpPathName,long null=0)
{
if(!CreateDirectoryW(lpPathName))
{
error=kernel32::GetLastError();
ErrorDescription(error);
return(false);
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| CopyFile function |
//| https://msdn.microsoft.com/en-us/library/windows/desktop/aa363851(v=vs.85).aspx |
//| Return code: |
//| ERROR_FILE_NOT_FOUND |
//| 2 (0x2) |
//| The system cannot find the file specified |
//| ERROR_FILE_EXISTS |
//| 80 (0x50) |
//| The file exists |
//+------------------------------------------------------------------+
bool WinAPI_CopyFile(int &error,const string lpExistingFileName,const string lpNewFileName,bool bFailIfExists)
{
if(!CopyFileW(lpExistingFileName,lpNewFileName,bFailIfExists))
{
error=kernel32::GetLastError();
ErrorDescription(error);
return(false);
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| CreateFileW function |
//| https://docs.microsoft.com/ru-ru/windows/desktop/api/fileapi/nf-fileapi-createfilew |
//| |
//| |
//| |
//| |
//| |
//| |
//| |
//| |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+