Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

MapViewOfFile - ошибка   Найти похожие ветки 

 
OlegTrubin   (2004-11-25 15:06) [0]

В DLL есть процедура:

procedure MappingGlobalData(var AData: Pointer; ASize: Integer);
var
 i: Integer;
 S: string;
begin
 FMapHandle:= CreateFileMapping(Invalid_Handle_Value, nil, PAGE_READWRITE, 0, ASize, "SomeName");
 if FMapHandle = 0 then
   RaiseLastWin32Error;

 {проецируем в адресное пространство процесса объект ядра "проекция файла"}
 AData := MapViewOfFile(FMapHandle, FILE_MAP_WRITE, 0, 0, ASize);

 {если неудача, возбуждаем исключение}
 if AData = nil then
 begin
   CloseHandle(FMapHandle);
   RaiseLastWin32Error;
 end;
end;

Суть в том, что  первым вызовом этой процедуры проецируем файл из страничного файла, одного размера, затем это функция вызывается N раз с разными значениями параметра ASize, и нужно каждый раз проецировать  файл из страничного файла соответствующего размера.
Так вот, первый раз все хорошо, а при повторном вызове получаем AData = nil. Это только под win98, под ХР все прокатывает. Почему?
Далее в полученный MMF пишутся данные, которые используются, когда эта DLL грузится в другие процессы. Можно наверно, как у Рихтера описано, использовать частичную передачу физической памяти проецируемым файлам т.е. вызвать это дело 1 раз с ASize большого размера с флагом SEC_RESERVE, а затем с помощью VirtualAlloc передавать память частями, когда надо. Но хотелось бы как выше описано, да вот MapViewOfFile подводит.


 
GuAV ©   (2004-11-25 18:00) [1]

"SomeName"

lpName
[in] Pointer to a null-terminated string specifying the name of the mapping object.

If this parameter matches the name of an existing named mapping object, the function requests access to the mapping object with the protection specified by flProtect.


Т.е. Вы думаете, что создаёте новый FileMapping, а фактически открываете старый.

Ошибка повторяется
 MappingGlobalData(P, 1000);
 MappingGlobalData(P, 2000);


Ошибка не повторяется
 MappingGlobalData(P, 2000);
 MappingGlobalData(P, 1000);


 
GuAV ©   (2004-11-25 18:08) [2]

Кстати,
{если неудача, возбуждаем исключение}
if AData = nil then
try
  RaiseLastWin32Error;
finally
  CloseHandle(FMapHandle);
end;


 
OlegTrubin   (2004-11-25 19:12) [3]


> Т.е. Вы думаете, что создаёте новый FileMapping, а фактически
> открываете старый.


Дак мне того и надо, цитата из вопроса:


> Далее в полученный MMF пишутся данные, которые используются,
> когда эта DLL грузится в другие процессы.


т.е. в других процессах я использую полученный MMF, открывая его с помощи имени.


 
GuAV ©   (2004-11-25 19:46) [4]

Вы хотите изменить размер FileMapping ?
Нужно тогда закрыть старый и создать новый.
Или при первом вызове указать маскимальный размер.
[2] - видно что оибка ERROR_NOT_ENOUGH_MEMORY.


 
OlegTrubin   (2004-11-25 20:22) [5]


> Нужно тогда закрыть старый и создать новый

Ну вызову я UnmapViewOfFile и CloseHandle, но если это дело используется в других процессах, как у меня задумано, тогда объект ядра проекция файла не будет уничтожена. Больше никак?


 
GuAV ©   (2004-11-25 20:29) [6]

GuAV ©   (25.11.04 19:46) [4]
при первом вызове указать маскимальный размер.


 
OlegTrubin   (2004-11-25 20:58) [7]


> при первом вызове указать маскимальный размер.


Я его не знаю, от юзера зависит, конечно можно, как я уже писал сделать:

> Можно наверно, как у Рихтера описано, использовать частичную
> передачу физической памяти проецируемым файлам т.е. вызвать
> это дело 1 раз с ASize большого размера с флагом SEC_RESERVE,
> а затем с помощью VirtualAlloc передавать память частями,
> когда надо.


Нет сделаю иначе - поменяю слегка логику: в других процессах буду создавать MMF по необходимости, использовать, и уничтожать. Синхронизацию придется замутить.


 
Digitman ©   (2004-11-26 10:53) [8]


> OlegTrubin


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



Страницы: 1 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.051 c
9-1096003204
Rem
2004-09-24 09:20
2005.01.16
Перпендикуляр


9-1096752441
Anybody
2004-10-03 01:27
2005.01.16
Вопрос про LagCount


14-1104123395
Чеширский_Кот
2004-12-27 07:56
2005.01.16
Приснился странный футбольный сон...


3-1103189813
lexis
2004-12-16 12:36
2005.01.16
У клиента не работает TClientDataSet


14-1103990640
Fima_MS
2004-12-25 19:04
2005.01.16
Линки может у кого есть?