Об использовании CreateFile для открытия канала в Windows: - PullRequest
1 голос
/ 19 августа 2010

Цитируется здесь :

hPipe = CreateFile( 
         lpszPipename,   // pipe name 
         GENERIC_READ |  // read and write access 
         GENERIC_WRITE, 
         0,              // no sharing 
         NULL,           // default security attributes
         OPEN_EXISTING,  // opens existing pipe 
         0,              // default attributes 
         NULL);  

Как приведенный выше код может убедиться, что он фактически открывает канал, а не существующий файл жесткого диска?

BTW,Как открыть постоянный канал, чтобы его можно было использовать несколько раз?

Ответы [ 2 ]

4 голосов
/ 19 августа 2010

Способ открытия канала - префикс в имени файла. Это должно быть \\\\.\\pipe\\pipename, что не является допустимым именем файла (для реального файла вы обычно начинаете с относительного пути или буквы диска, двоеточия и косой черты, за исключением редкого случая открытия с использованием идентификатора устройства или некоторые такие). Поскольку он не может открыть файл, он должен открыть канал.

Чтобы открыть постоянный канал, я не уверен, хотите ли вы использовать его из нескольких приложений одновременно (если это так, вы можете открыть его из каждого, но будьте осторожны, чтобы не заблокировать его) или сделать так, чтобы он сохранялся между сессий. Если последнее, я не совсем уверен, но я никогда не слышал о способе сохранить канал открытым, когда ни одна программа не открыла его (я бы предположил, что в некотором смысле это похоже на сохранение файла открытым). возможно , что, пока вы не CloseHandle, оно останется открытым до следующей перезагрузки. Стоит проверить, по крайней мере.

Если вам нужна постоянная передача данных между приложениями или сеансами, вы, возможно, захотите найти более надежный (и более гибкий) метод. Каналы могут быть легко заблокированы, если произойдет что-то непредвиденное (что всегда следует ожидать, когда несколько потоков / процессов работают вместе), что может заморозить одно или оба подключенных приложения (часто до такой степени, что даже убить их в отладчике трудно)

4 голосов
/ 19 августа 2010

Имя канала должно начинаться с \\.\pipe\ (или, в более общем случае, \\servername\pipe\).Файл на жестком диске никогда не будет иметь этот префикс, поэтому вам просто нужно убедиться, что имя имеет этот префикс.В качестве альтернативы, вы можете использовать CallNamedPipe, который (я почти уверен) потерпит неудачу, если ему будет передано имя, отличное от именованной трубы.- Вы можете отправить столько сообщений / столько данных по каналу, сколько пожелаете.Если вы имеете в виду открытие одного именованного канала на сервере, который может использоваться несколькими клиентами, последний параметр при вызове CreateNamedPipe указывает максимально допустимое число одновременных экземпляров (по сути, клиентов).

...