2011-08-01 239 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