C++ 在vs 2003上将管道(处理程序)转换为fd时出错

C++ 在vs 2003上将管道(处理程序)转换为fd时出错,c++,c,gtk,glibc,windows,C++,C,Gtk,Glibc,Windows,我试图使用通知一个主gtk线程(来自一个单独的线程),其中一些甚至是使用管道发生的。在尝试设置管道时,我收到以下警告。什么是好的解决方法 当我看到这个g_io_channel_win32_new_fd时,我看到了这个警告,因此根本没有创建管道:( GLib警告**:win32.c:1564:3不是c库文件描述符 int fds[2]; GIOChannel* gioChannels[2]; HANDLE rdPipe, wrPipe; SECURITY_ATTRI

我试图使用通知一个主gtk线程(来自一个单独的线程),其中一些甚至是使用管道发生的。在尝试设置管道时,我收到以下警告。什么是好的解决方法

当我看到这个g_io_channel_win32_new_fd时,我看到了这个警告,因此根本没有创建管道:(

GLib警告**:win32.c:1564:3不是c库文件描述符

    int fds[2];
    GIOChannel* gioChannels[2];
    HANDLE rdPipe, wrPipe;
    SECURITY_ATTRIBUTES saAttr;

    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
    saAttr.bInheritHandle = TRUE; 
    saAttr.lpSecurityDescriptor = NULL;
    if (CreatePipe(&rdPipe, &wrPipe, NULL, 1024)) 
    {
       fds[0]  =_open_osfhandle((gssize)rdPipe,  O_RDONLY); 
       fds[1] = _open_osfhandle((long)wrPipe,_O_APPEND);

       gioChannels[0] =g_io_channel_win32_new_fd(fds[0] );
       gioChannels[1] =g_io_channel_win32_new_fd(fds[0] );

       g_io_add_watch( gioChannels[1],(GIOCondition) (G_IO_IN | G_IO_HUP), 
                        (GIOFunc)SomeCallaback,(gpointer)this );

    }
目标是通知主应用程序线程中发生了一些事情。在我的情况下,我不能以多线程方式使用gtk(从派生线程调用主线程的函数),所以我尝试通过管道来实现

我还发现这可能是VisualStudio在这方面的问题


有什么建议吗?

如错误所述,CreatePipe创建的句柄不是文件描述符。Windows编程模型不使用文件描述符,因此您通常无法混合和匹配Windows和非Windows I/O函数。我怀疑如果您删除了代码中的一些强制转换,您的编译器将查明问题所在-C风格C++代码中的CASRS(或重新解释)
几乎总是表明你做错了什么。

谢谢,我明白-你建议什么解决方法?