Функция CreateFile полезна для открытия файлов или устройств для доступа для чтения / записи, обеспечивая дескриптор.
Третий параметр, dwShareMode , указывает, могут ли другие файлы впоследствии получить доступ к файлу / устройству. Пример с файлами:
void* pFileHandle1 = ::CreateFileA("C:\\test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
DWORD lastError = GetLastError(); // 0, ERROR_SUCCESS
void* pFileHandle2 = ::CreateFileA("C:\\test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 0, ERROR_SUCCESS
Все хорошо здесь: у нас есть 2 разных дескриптора, которые могут читать / записывать один файл.
Но в моем случае я хочу использовать COM-порт:
void* pComHandle1 = ::CreateFileA("\\\\.\\COM3", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 0, ERROR_SUCCESS
void* pComHandle2 = ::CreateFileA("\\\\.\\COM3", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
lastError = GetLastError(); // 5, ERROR_ACCESS_DENIED Oops!
Первый дескриптор действителен и может использоваться, но второй - INVALID_HANDLE_VALUE.
Что с этим? Разве вы не можете использовать COM-порты таким образом?