2011-12-13 120 views
5

这是我的问题: 我有一个封闭源代码的第三方Win32应用程序,它通过命名管道作为其他程序的服务器,也就是说它期望它的客户端做这样的操作:WINE和Windows命名管道

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

这个应用程序在葡萄酒中运行完美,除了我无法与它沟通。所以这里是我的问题:

当请求打开管道时,WINE会做什么?比如说,是否将它映射到〜/ .wine中的某个FIFO文件/或者其他地方?有没有任何方式与Linux应用程序的这种程序进行通信?谷歌对此一无所知。

谢谢。

回答

2

命名管道的葡萄酒服务器进程主持。 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服务器创建的匿名管道,一端发送到管道服务器,另一端发送到管道客户端。