Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.036 c
14-1103817997
ArMellon
2004-12-23 19:06
2005.01.16
Как работать в делфи с форматом kar?


3-1102579466
denis24
2004-12-09 11:04
2005.01.16
создание adoconnection и adoquery в потоке


1-1103876490
Layner
2004-12-24 11:21
2005.01.16
подскажите плз, можно ли из под сервиса писать файл?


1-1104742021
leonidus
2005-01-03 11:47
2005.01.16
Получить массив содержащий все поддирректории данной директории


1-1104212175
Mate_ru
2004-12-28 08:36
2005.01.16
параметры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский