Создать файл * из строки - PullRequest
       1

Создать файл * из строки

0 голосов
/ 01 августа 2011

Я использую библиотеку, в которой они использовали пути для определения входных и выходных файлов, в которые данные считываются / записываются.

App1 записывает входной файл, App2 читает этот входной файл и создает выходной файл. Затем App1 читает результат, и все счастливы.

Теперь мы получаем требование, чтобы для связи между App1 и App2 больше не создавалось файлов. Следовательно, App1 должен передать буфер в App2 (простой char*) вместе с предварительно выделенным выходным буфером, где App2 должен записать результаты в.

К сожалению, во всей библиотеке, которая используется в App2, FILE* используется для чтения из / записи в.

Итак, вот вопрос: могу ли я достичь & ndash; это без переписывания библиотеки, используемой App2 & ndash; (или с небольшими изменениями), что я могу использовать буферы, переданные от App1 до App2 для обмена информацией? ИМХО, это потребовало бы, чтобы я мог создать FILE* из буфера, не имея этого FILE* на диске.

Я читал, что для .NET я мог бы использовать класс System.IO.StringReader, но, поскольку я использую простой C ++ и не .NET, я не могу использовать этот материал.


Дополнительный бонус:
Вызывающая сторона (т. Е. App1) - это управляемый код (приложение C #), вызывающая сторона (т. Е. App2) - простая DLL C ++ (т.е. App1 вызывает функцию в этой DLL).


Edit:
Я бы предпочел ответы, где обмен данными мог бы происходить синхронно таким образом, чтобы вызывающая сторона передавала буферы вызываемой стороне, вызываемая сторона считывала из входного буфера и записывала в выходной буфер, затем вызываемая сторона заканчивала работу, и вызывающая сторона могла читать содержимое буферы.

1 Ответ

3 голосов
/ 01 августа 2011

Для IPC вы можете использовать трубы, легко сделать FILE* из winapi HANDLE, созданного для трубы.

Этот код покажет, как:

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 вы должны использовать именованные каналы, но идея та же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...