В чем заключается разница между функциями в WinAPI
В данный момент познаю WinAPI и столкнулся с недопониманием.
В чем разница между функциями CreateFile CreateFileA Createfile2
По моему мнению они все реализуют один и тот же функционал. Так для чего нам три функции.
Ответы (1 шт):
CreateFile это define-токен, расширяется в CreateFileW для UNICODE (16-бит), или в CreateFileA ANSI (8-бит). Последние - это функции, у них одна разница в типе параметра имени файла (lpFileName): LPCWSTR или LPCSTR соответственно. А функция CreateFile2 имеет меньше входных параметров, а тип имени файла LPCWSTR (как у CreateFileW, для UNICODE).
Вот для сравнения их сигнатуры (из файла заголовка <fileapi.h>:
HANDLE
CreateFileA(
_In_ LPCSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
HANDLE
CreateFileW(
_In_ LPCWSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
);
#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif // !UNICODE
HANDLE
CreateFile2(
_In_ LPCWSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_ DWORD dwCreationDisposition,
_In_opt_ LPCREATEFILE2_EXTENDED_PARAMETERS pCreateExParams
);
Практически, проще и удобнее пользоваться CreateFile2, более новой и простой функцией. Особенно, если учесть, что в русскоязычной сфере, скорее всего имена файлов будут содержать UNICODE символы (напр. "мой_файл_данных.txt").
Примерно так:
HANDLE h = CreateFile2(L"./мой_файл.txt", GENERIC_WRITE, 0x0, CREATE_ALWAYS, nullptr);