2011-08-01 242 views
0

我正在使用一个库,他们使用路径来定义输入和输出文件的数据读取/写入。从字符串创建FILE *

App1写入输入文件,App2读取该输入文件并创建输出文件。然后,App1读取输出,每个人都很高兴。

现在我们得到App1App2之间的通讯不再需要创建文件了。因此,App1应将缓冲区传递到App2(简单的char*)以及App2应将结果写入的预分配输出缓冲区。

不幸的是,在App2中使用的整个库中,使用FILE*来读取/写入。

所以,这里的问题:我能实现–  它无需重写由应用2  使用的库–(或小的变化),我可以使用来自App1通过缓冲区App2的信息交流?恕我直言,这将需要我可以创建一个FILE*从缓冲区没有那FILE*在磁盘上。

我读到.NET的我可以使用System.IO.StringReader类,但由于我使用普通的C++和没有.NET,我不能使用这些东西。


额外的好处:
呼叫者(即App1)被托管代码(C#应用程序),则被叫方(即App2)是一个普通的C++ DLL(即App1在DLL调用的函数)。


编辑:
我赞成的答案,其中数据交换可以在调用者传递的缓冲区到被叫方,被叫方从输入缓冲区读取和写入到输出缓冲区的方式同步发生,那么被调用者终止并且调用者可以读取缓冲区的内容。

+1

对于最后一部分,只需在调用者中创建一个处理被调用者的线程即可。 – MSalters

+0

@ MSalters:hm。这将是结果。试图避免这... – eckes

回答

3

对于IPC你可以使用管道,很容易从管道的winapi HANDLE创建FILE*

此代码将展示如何:

HANDLE read_hnd; 
HANDLE write_hnd; 
//make sa (SECURITY_ATTRIBUTES) 
if(!CreatePipe(&read_hnd, &write_hnd, &sa, NULL)) 
{ 
//error 
} 
int fd = _open_osfhandle((intptr_t)read_hnd, _O_RDONLY|_O_TEXT); 
FILE *pipe_read_file = _fdopen(fd, "rt"); 

对于IPC你应该使用命名管道,但想法是相同的。

+0

请参阅编辑的问题:是否可以在托管和非托管代码之间通过管道进行通信? – eckes

+0

@eckes请参阅编辑答案,您可以创建真正指向管道的“FILE *”。 –

+0

我认为,管道不是正确的措施。为了尽力而为,数据交换应该同步进行。但对于管道,似乎有一方等待另一方的等待点。你能否扩大你的答案(即主叫方是否可以将被叫方的消息存储在命名管道中)?看到更新的问题。 – eckes