192 lines
21 KiB
MQL5
192 lines
21 KiB
MQL5
//+------------------------------------------------------------------+
|
||
//| WinAPI.mqh |
|
||
//| Copyright © 2018, Vladimir Karputov |
|
||
//| http://wmua.ru/slesar/ |
|
||
//+------------------------------------------------------------------+
|
||
#property copyright "Copyright © 2018, Vladimir Karputov"
|
||
#property link "http://wmua.ru/slesar/"
|
||
#property version "1.001"
|
||
#include "WinAPIErrorsDescription.mqh"
|
||
//---
|
||
#import "kernel32.dll"
|
||
int GetLastError();
|
||
/*
|
||
CreateDirectoryW
|
||
Параметры
|
||
lpPathName [in]
|
||
Путь папки, которая будет создана
|
||
lpSecurityAttributes [in, optional]
|
||
Ссылка на структуру описывающиую безопастность папки. Просто передаём "0".
|
||
Возвращаемое значение
|
||
Если функция завершается успешно, то возвращаемое значение не равно нулю.
|
||
Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить расширенную информацию
|
||
об ошибке, вызовите функцию kernel32::GetLastError(). Возможные ошибки:
|
||
ERROR_ALREADY_EXISTS
|
||
ERROR_PATH_NOT_FOUND
|
||
*/
|
||
bool CreateDirectoryW(string &lpPathName,long lpSecurityAttributes=0);
|
||
/*
|
||
CopyFileW
|
||
Параметры
|
||
lpExistingFileName [in]
|
||
Имя существующего файла.
|
||
Здесь принудительно принято ограничение по длине имени — MAX_PATH символов, этого всегда хватит для нашего примера.
|
||
Если файл с именем lpExistingFileName не существует, то функция терпит неудачу,
|
||
и kernel32::GetLastError() возвращает ERROR_FILE_NOT_FOUND.
|
||
lpNewFileName [in]
|
||
Имя нового файла.
|
||
Здесь принудительно принято ограничение по длине имени — MAX_PATH символов, этого всегда хватит для нашего примера.
|
||
bFailIfExists [in]
|
||
Если этот параметр true и новый файл, указанный в lpNewFileName существует, функция терпит неудачу.
|
||
Если этот параметр false и новый файл существует, функция перепишет существующий файл и успешно завершит работу.
|
||
Возвращаемое значение
|
||
Если функция завершается успешно, то возвращаемое значение не равно нулю.
|
||
Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить дополнительную информацию
|
||
об ошибке, вызовите функцию kernel32::GetLastError(). Возможные ошибки:
|
||
ERROR_FILE_NOT_FOUND
|
||
*/
|
||
int CopyFileW(string lpExistingFileName,string lpNewFileName,bool bFailIfExists);
|
||
|
||
int FindClose(int hFindFile);
|
||
int FindClose(long hFindFile);
|
||
/*
|
||
CreateFileW
|
||
Параметры
|
||
lpFileName
|
||
Имя файла или устройства, которое будет создано или открыто.
|
||
Вы можете использовать либо косую черту (/), либо обратную косую черту () в этом имени.
|
||
dwDesiredAccess
|
||
Запрошенный доступ к файлу или устройству, который можно суммировать как чтение, запись, оба или.
|
||
Наиболее часто используемые значения: GENERIC_READ, GENERIC_WRITE или оба (GENERIC_READ|GENERIC_WRITE).
|
||
dwShareMode
|
||
Запрошенный режим совместного доступа к файлу или устройству, который можно читать, записывать, читать и записывать,
|
||
удалять, любой из них (см. Следующую таблицу). Этот запрос не влияет на запросы доступа к атрибутам
|
||
или расширенным атрибутам.
|
||
0 hex 0x00000000 Запрещает другим процессам открывать файл или устройство,
|
||
если они запрашивают удаление, чтение или запись.
|
||
FILE_SHARE_DELETE hex 0x00000004 Включает последующие операции открытого доступа к файлу
|
||
или устройству для запроса доступа на удаление.
|
||
FILE_SHARE_READ hex 0x00000001 Включает последующие операции открытого доступа к файлу
|
||
или устройству для запроса доступа на чтение.
|
||
FILE_SHARE_WRITE hex 0x00000002 Включает последующие операции открытого доступа к файлу
|
||
или устройству для запроса доступа на запись.
|
||
lpSecurityAttributes
|
||
Указатель на структуру SECURITY_ATTRIBUTES, которая содержит два отдельных, но связанных элемента данных:
|
||
необязательный дескриптор безопасности и логическое значение, определяющее, может ли
|
||
возвращенный дескриптор наследоваться дочерними процессами.
|
||
Этот параметр может быть NULL.
|
||
dwCreationDisposition
|
||
Действие, которое требуется для создания файла или устройства, которое существует или не существует.
|
||
Для других устройств, кроме файлов, этот параметр обычно устанавливается на OPEN_EXISTING.
|
||
CREATE_ALWAYS 2 Создает новый файл, всегда. Если указанный файл существует и доступен для записи,
|
||
функция перезаписывает файл, функция успешно завершается,
|
||
а код последней ошибки - ERROR_ALREADY_EXISTS (183).
|
||
CREATE_NEW 1 Создает новый файл, только если он еще не существует. Если указанный файл
|
||
существует, функция завершается с ошибкой,
|
||
а код последней ошибки - ERROR_FILE_EXISTS (80).
|
||
OPEN_ALWAYS 4 Открывает файл всегда. Если указанный файл существует,
|
||
функция завершается успешно, а код последней ошибки - ERROR_ALREADY_EXISTS (183).
|
||
OPEN_EXISTING 3 Открывает файл или устройство, только если он существует. Если указанный файл
|
||
или устройство не существует, функция завершается с ошибкой,
|
||
а код последней ошибки - ERROR_FILE_NOT_FOUND (2).
|
||
TRUNCATE_EXISTING 5 Открывает файл и обрезает его так, что его размер равен нулю байтам,
|
||
только если он существует. Если указанный файл не существует,
|
||
функция завершается с ошибкой, а код последней ошибки - ERROR_FILE_NOT_FOUND (2).
|
||
dwFlagsAndAttributes
|
||
Атрибуты и флаги файла или устройства, FILE_ATTRIBUTE_NORMAL - наиболее распространенное значение по умолчанию для файлов.
|
||
FILE_ATTRIBUTE_NORMAL dec 128 hex 0x80 У файла нет других атрибутов. Этот атрибут действителен только в том случае, если он используется один.
|
||
FILE_ATTRIBUTE_READONLY dec 1 hex 0x1 Файл доступен только для чтения. Приложения могут читать файл, но не могут его записать или удалить.
|
||
hTemplateFile
|
||
Правильный дескриптор файла шаблона с правом доступа GENERIC_READ. Файл шаблона предоставляет атрибуты файлов
|
||
и расширенные атрибуты для создаваемого файла.
|
||
Этот параметр может быть NULL.
|
||
Возвращаемое значение
|
||
Если функция завершается успешно, возвращаемое значение является открытым дескриптором для указанного файла,
|
||
устройства, именованного канала или почтового слота.
|
||
Если функция не работает, возвращается значение INVALID_HANDLE_VALUE. Чтобы получить расширенную информацию
|
||
об ошибке, вызовите 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 |
|
||
//| |
|
||
//| |
|
||
//| |
|
||
//| |
|
||
//| |
|
||
//| |
|
||
//| |
|
||
//| |
|
||
//+------------------------------------------------------------------+
|
||
|
||
//+------------------------------------------------------------------+
|