C++ 如何枚举进程中所有命名管道的名称?

C++ 如何枚举进程中所有命名管道的名称?,c++,c,windows,named-pipes,C++,C,Windows,Named Pipes,我需要打开某个命名管道,以便对其进行模糊测试,但是我的测试代码无法访问用于生成命名管道名称的相同数据。但是,我可以识别管道的名称,然后使用该名称打开管道进行模糊处理 我使用此论坛帖子开始枚举系统上句柄的名称: 但是,由于某些原因,它似乎无法与命名管道一起工作 TL;DR:我需要使用什么API来列出Windows上当前进程中所有命名管道的名称?这将枚举系统中所有命名管道,或者至少让您朝着正确的方向迈出一步 当使用-fppermission构建时,它在MinGW中工作。它应该在MSVC中使用类似的

我需要打开某个命名管道,以便对其进行模糊测试,但是我的测试代码无法访问用于生成命名管道名称的相同数据。但是,我可以识别管道的名称,然后使用该名称打开管道进行模糊处理

我使用此论坛帖子开始枚举系统上句柄的名称:

但是,由于某些原因,它似乎无法与命名管道一起工作


TL;DR:我需要使用什么API来列出Windows上当前进程中所有命名管道的名称?

这将枚举系统中所有命名管道,或者至少让您朝着正确的方向迈出一步

当使用-fppermission构建时,它在MinGW中工作。它应该在MSVC中使用类似的设置

#ifndef _WIN32_WINNT
// Windows XP
#define _WIN32_WINNT 0x0501
#endif

#include <Windows.h>
#include <Psapi.h>


// mycreatepipeex.c is at http://www.davehart.net/remote/PipeEx.c
// I created a simple header based on that.    
#include "mycreatepipeex.h"

#include <iostream>
#include <cstdio>
#include <errno.h>

void EnumeratePipes()
{
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;

#define TARGET_PREFIX "//./pipe/"
    const char *target = TARGET_PREFIX "*";

    memset(&FindFileData, 0, sizeof(FindFileData));
    hFind = FindFirstFileA(target, &FindFileData);
    if (hFind == INVALID_HANDLE_VALUE) 
    {
        std::cerr << "FindFirstFileA() failed: " << GetLastError() << std::endl;
        return;
    }
    else 
    {
        do
        {
            std::cout << "Pipe: " << TARGET_PREFIX << FindFileData.cFileName << std::endl;
        }
        while (FindNextFile(hFind, &FindFileData));

        FindClose(hFind);
    }
#undef TARGET_PREFIX

    return;
}

int main(int argc, char**argv)
{
    HANDLE read = INVALID_HANDLE_VALUE;
    HANDLE write = INVALID_HANDLE_VALUE;
    unsigned char pipe_name[MAX_PATH+1];

    BOOL success = MyCreatePipeEx(&read, &write, NULL, 0, 0, 0, pipe_name);

    EnumeratePipes();

    if ( success == FALSE )
    {
        std::cerr << "MyCreatePipeEx() failed: " << GetLastError() << std::endl;
        return 1;
    }

    FILE *f = fopen((const char*)pipe_name, "rwb");
    if ( f == NULL )
    {
        std::cerr << "fopen(\"" << pipe_name << "\") failed: " << (int)errno << std::endl;
    }

    CloseHandle(read);
    CloseHandle(write);

    return 0;
}
\ifndef\u WIN32\u WINNT
//视窗XP
#定义_WIN32_WINNT 0x0501
#恩迪夫
#包括
#包括
//mycreatepipeex.c位于http://www.davehart.net/remote/PipeEx.c
//我基于此创建了一个简单的标题。
#包括“mycreatepipeex.h”
#包括
#包括
#包括
空管()
{
WIN32_FIND_DATA FindFileData;
处理高频风;
#定义目标_前缀“///pipe/”
常量字符*目标=目标前缀“*”;
memset(&FindFileData,0,sizeof(FindFileData));
hFind=FindFirstFileA(目标和FindFileData);
if(hFind==无效的句柄值)
{

std::cerr您是否特别需要仅在当前进程中枚举管道?我已经有一个Windows命名管道枚举,但它是系统范围的。我只需要在当前进程中迭代命名管道,尽管我完全可以枚举系统上的所有管道。我需要一点时间来验证这一点,但是这看起来很合理。我将在一两天内投票并解决这个问题。谢谢!我会注意到这在Windows上运行得很好-对目标字符串进行了轻微的编辑。但我不确定OP为什么使用这样的宏。很容易在“//管道/”和L//管道/”之间切换在这一点上,在所有代码中,它并不重要,因为它很短。