7

这是我的问题:我有一个封闭源代码的第三方 Win32 应用程序,它通过命名管道充当其他程序的服务器,即它希望它的客户端这样做:

HANDLE h = CreateFile("\\\\.\\pipe\\$pipe_name$", GENERIC_READ | GENERIC_WRITE, etc...);
// ...
TransactNamedPipe(h, buf, etc...);
// ...
CloseHandle(h);

这个应用程序在 WINE 中完美运行,只是我无法与之通信。所以这是我的问题:

当要求打开管道时,WINE 究竟做了什么?例如,它是否将其映射到 ~/.wine/ 或其他任何地方的某个 FIFO 文件?有没有办法从 Linux 应用程序与这样的程序进行通信?谷歌对此一无所知。

谢谢你。

4

2 回答 2

4

葡萄酒官方 wiki 中的命名管道

这篇文章也可以提供帮助:http: //lkcl.net/namedpipes/namedpipes-emulation.txt

于 2011-12-13T19:56:11.300 回答
4

命名管道由 WINE 服务器进程托管。WINE 客户端将请求发送到此进程。例如,CreateNamedPipe使用如下请求:

    SERVER_START_REQ( open_file_object )
    {
        req->access     = access;
        req->attributes = attr->Attributes;
        req->rootdir    = wine_server_obj_handle( attr->RootDirectory );
        req->sharing    = sharing;
        req->options    = options;
        wine_server_add_data( req, attr->ObjectName->Buffer, attr->ObjectName->Length );
        io->u.Status = wine_server_call( req );
        *handle = wine_server_ptr_handle( reply->handle );
    }

服务器管理连接命名管道。一旦客户端和服务器连接起来,WINE 服务器就会通过向客户端发送一个 fd 来让路。我认为这个 fd 只是 WINE 服务器创建的一个匿名管道,一端发送到管道服务器,一端发送到管道客户端。

于 2011-12-13T20:20:38.473 回答