我正在尝试根据句柄查找命名管道的名称。我找到了一个解决方案,其中使用 NtDuplicateObject 复制命名管道句柄,然后使用 NtQueryObject 提取名称,但它不稳定,所以这是不可能的。
目前,我正在尝试使用 GetFinalPathNameByHandle 这样做,但没有成功。我什至不确定是否可以这样做,但有人提到它是一种潜在的解决方案,所以我将继续这样做。以下内容改编自示例代码:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364962(v=vs.85).aspx
void __cdecl _tmain(int argc, TCHAR *argv[]){
TCHAR Path[BUFSIZE];
HANDLE pipe;
DWORD dwRet;
printf("\n");
if (argc != 2)
{
printf("ERROR:\tIncorrect number of arguments\n\n");
printf("%s <file_name>\n", argv[0]);
return;
}
pipe = CreateNamedPipe(argv[1], PIPE_ACCESS_INBOUND | PIPE_ACCESS_OUTBOUND, PIPE_WAIT, 1,
1024, 1024, 120 * 1000, NULL);
if (pipe == INVALID_HANDLE_VALUE)
{
printf("Could not open file (error %d\n)", GetLastError());
return;
}
dwRet = GetFinalPathNameByHandle(pipe, Path, BUFSIZE, VOLUME_NAME_NT);
if (dwRet < BUFSIZE)
{
_tprintf(TEXT("\nThe final path is: %s\n"), Path);
}
else printf("\nThe required buffer size is %d.\n", dwRet);
CloseHandle(pipe);}
命令行参数是“\\\\.\\pipe\\mynamedpipe”或“\\.\pipe\mynamedpipe”,我都试过了。输出是垃圾,但更重要的是,在单步执行程序时使用 Visual Studio 2013 Express 进行调试时,路径变量在 GetFinalPathNameByHandle 调用后直接是垃圾。
垃圾是指:
- Path 0x0036fab4 L"쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌 쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌... wchar_t[100]
控制台输出为:
- 最终路径是:???????????????????????????????????????????????? ???????????????????????????????????????? ??????????????6?╫☻
所以我正式卡住了。或者,可能更好的解决方案是将两个命名管道句柄相互比较以确定它们是否指向同一个命名管道。如果有办法做到这一点,它也会解决我的问题。
最佳答案
在这里回答我自己的问题。 GetFileInformationByHandleEx使用 FileInformationClass 参数的 FileNameInfo 和 CreateNamedPipe 生成的句柄正是这样做的。
关于c++ - 给定句柄的命名管道的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27321002/