我还想知道是否可以使用某种 . 调用枚举所有命名管道,然后解析出我正在查找的管道:“\.\pipe\FastCGI\”
还有人对这些评论有经验吗:http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/225878
TmpInfo = DirInfo;
while(1)
{
if(TmpInfo->NextEntryOffset==0)
break;
TmpInfo->FileDirectoryInformationClass.FileName[TmpInfo->FileNameLength/sizeof(WCHAR)] = NULL;
wprintf(L"%s (%d, %d)\n",TmpInfo->FileDirectoryInformationClass.FileName,
TmpInfo->EndOfFile.LowPart,
TmpInfo->AllocationSize.LowPart );
TmpInfo = (PFILE_QUERY_DIRECTORY)((DWORD)TmpInfo+TmpInfo->NextEntryOffset);
}
使用未记录的函数:
// NtQueryDirectoryFile(
// IN HANDLE FileHandle, // 文件句柄
// IN HANDLE EventHandle OPTIONAL,
// IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
// IN PVOID ApcContext OPTIONAL,
// OUT PIO_STATUS_BLOCK IoStatusBlock,
// OUT PVOID Buffer, // 指向接收结果的缓冲区指针
// IN ULONG BufferLength, // 缓冲区长度
// IN FILE_INFORMATION_CLASS InformationClass,// 信息类型
// IN BOOLEAN ReturnByOne, // 每次调用仅返回一个文件的信息
// IN PUNICODE_STRING FileTemplate OPTIONAL, // 搜索模板
// IN BOOLEAN Reset // 重启搜索
// );
感谢您发现了这个问题。我将此代码转换为另一种类似于C语言的语言,并使用了FILE_NAMES_INFORMATION,因为我只需要查找名称。
然后,我使用另一个应用程序创建了一个命名管道:
\\.\pipe\test
好的,我在用于生成管道列表的代码中发现了另一个错误(有关第一个错误的详细信息请参见帖子)。
至于链接中“是否有人有这些评论的经验”的信息,我理解他们在谈论什么,你能否更具体地说明你不理解或感到好奇的是什么(关于无法执行非阻塞操作的部分有点虚假,尽管它不是以Unix系统的“传统”方式完成的)。
论坛软件切掉了管道名称的第一个反斜杠。管道名称为:
\\.\pipe\test
(在我用于测试的语言中)它不需要进行转义
我编写了两个应用程序,一个是管道服务器,另一个是管道客户端,用于测试阻塞等功能。它们运行得非常完美。
我使用以下代码创建管道:
Pipe_Name = "\\.\pipe\test"
MaxInstances = 1
OutBufferSize = 1024
InBufferSize = 1024
hPipe = CreateNamedPipe(_
Pipe_Name, _ ' Name of the Pipe
PIPE_ACCESS_DUPLEX, _ ' Specifies the pipe access/overlapped/write-through/security access modes
PIPE_TYPE_MESSAGE OR PIPE_READMODE_MESSAGE, _ ' Specifies the type, read, and wait modes of the pipe handle
MaxInstances, _ ' Specifies the maximum number of instances that can be created for this pipe
OutBufferSize, _ ' Specifies the number of bytes to reserve for the output buffer
InBufferSize, _ ' Specifies the number of bytes to reserve for the input buffer
0, _ ' Specifies the default time-out value, in milliseconds
Security_Declaration) ' Pointer to a SECURITY_ATTRIBUTES structure
它不会返回INVALID_HANDLE_VALUE,而是一个有效的句柄,我随后使用它并且完美地工作。 它按预期阻塞并且通信良好。
(DWORD)TmpInfo
(应该将DWORD
替换为64位值)。IO_STATUS_BLOCK
应该有一个LONG* Status
字段,而不是LONG Status
。 - AdamF