2012-02-21 2 views
4

Мое приложение выполняет другой процесс ("update.exe"), и я хотел бы передать большие данные (возможно, запись) из моего приложения в программу .Как правильно использовать сопоставление файлов и передавать данные дочернему процессу?

Использование командной строки для передачи параметров (ов) данных не является опцией, поскольку данные слишком велики (также размер данных может отличаться).

Как правильно создать CreateFileMapping/MapViewOfFile/UnmapViewOfFile,
затем Исполнительное мой update.exe,
наконец Получая данные в update.exe программы (OpenFileMapping)
и освобождение всех ручками (из основного приложения и update.exe), поэтому у меня нет памяти/утечек ручек?

Код был бы хорош (нет JCL пожалуйста). C++ тоже прекрасен. Спасибо.


Edit: Я думаю, что моя основная проблема заключается в том, как «сигнал» главное приложение к UnmapViewOfFile и CloseHandle после update.exe сделать чтение данных. (или, может быть, мне нужно использовать OpenFileMapping с bInheritHandle, установленным в True в моем дочернем процессе?)
Вот Example. Как второй процесс может считывать данные, если основной процесс вызывает UnmapViewOfFile и CloseHandle?.

+3

Но JCL - это удивительность ... –

+1

Простым решением является хранение данных в файле и передача имени файла в командной строке. –

+1

@LURD, excatlly, что я хочу сделать, но передать имя FileMapping в качестве параметра и использовать 'OpenFileMapping' ...;) – ZigiZ

ответ

2

Вы можете найти хороший пример на Inter-process communication. Правильный метод зависит от размера ваших данных и требований к скорости.

1

Heres фрагмент кода из файла с отображением памяти, который мы используем для передачи живого видео (несжатого) между нашими приложениями, SecurityDescriptor не нужен, но я оставил его, и CreateWorldAccessDescriptor является одной из наших функций.

Если вам нужно использовать этот тип системы для управления сообщениями от услуг приложения, или из приложений, работающих с различными учетными данными убедитесь, что вы начать свой FileName с «Global \»

procedure TRawFeedImageQueue.CreateFileMap; 
var 
    SysInfo: TSystemInfo; 
    sd: TSecurityDescriptor; 
begin 
    GetSystemInfo(SysInfo); 
    MapGranularity := SysInfo.dwAllocationGranularity; 
    MapSize := sizeof(TRawFeedImageQueueData); 

    FSecObjOk := CreateWorldAccessDescriptor(sd, GENERIC_ALL); 

    FileMappingHandle := CreateFileMapping($FFFFFFFF, @sd, PAGE_READWRITE OR SEC_COMMIT, 0, MapSize and $FFFFFFFF, PChar(FFileName)); 
    if FileMappingHandle <> 0 then 
    begin 
    MapView := MapViewOfFile(FileMappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, MapSize); 
    end 
    else 
    begin 
    MapView := nil; 
    end; 
end; 

procedure TRawFeedImageQueue.ReleaseFileMap; 
begin 
    if FileMappingHandle <> 0 then 
    begin 
    unMapViewOfFile(MapView); 
    CloseHandle(FileMappingHandle); 
    end; 
end; 

Надежда, которая помогает немного.

Update

Этот код просто создает MapView на файл весь файл, а только один вид, вы можете, конечно, создать несколько небольших взглядов на тот же файл, если это необходимо.

Смежные вопросы