Текущий архив: 2004.03.28;
Скачать: CL | DM;
Вниз
CreateMappingFile Найти похожие ветки
← →
DelphiN! © (2004-03-09 20:36) [0]Вот сделал признок в памяти на то, что моя прога иже запущена, а как его убрать не знаю. Вот код:
AppExample:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"MyProg");
if GetLastError = ERROR_ALREADY_EXISTS then
halt;
Тоесть моя прога 2 раза не запустится, а как убрать этот признак, чтобы GetLastError не возвращяла ERROR_ALREADY_EXISTS?
Буду рад примерчику
Заранее благодарен
← →
jack128 © (2004-03-09 21:45) [1]Хелп читать умеем?
o fully close a file mapping object, an application must unmap all mapped views of the file mapping object by calling UnmapViewOfFile, and close the file mapping object handle by calling CloseHandle.
← →
DelphiN! © (2004-03-09 22:01) [2]>Jack128 Я читал.
Написал следующее:
var
Base: Pointer;
AppExample:integer;
begin
AppExample:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"Map1");//Забиваем
Base:=MapViewOfFile(AppExample,FILE_MAP_READ,0,0,0);
UnMapViewOfFile(Base);//Освобаждаем
CloseHandle(AppExample);//---|---|---
AppExample:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"Map1");//Забиваем
if GetLastError = ERROR_ALREADY_EXISTS then //по идее тут должно быть false, так как я выше забил освобожденную память, но не тут-то было
halt;
ShowMessage("Ok");
По идее, если память освобаждается, то должен появиться showmessage, но он не появляется, следовательно память не освобаждается!
← →
jack128 © (2004-03-09 22:27) [3]Мой вариант
var
на выходе Ok. Какие выводы?
Base: Pointer;
AppExample:integer;
begin
AppExample:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"Map1");//Забиваем
Base:=MapViewOfFile(AppExample,FILE_MAP_READ,0,0,0);
UnMapViewOfFile(Base);//Освобаждаем
CloseHandle(AppExample);//---|---|---
AppExample:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"Map1");//Забиваем
if (AppExample = 0) and (GetLastError = ERROR_ALREADY_EXISTS) then //по идее тут должно быть false, так как я выше забил освобожденную память, но не тут-то было
WriteLn("Already_exists")
else
begin
WriteLn("Ok");
CloseHandle(AppExample);
end;
ReadLn;
end.
← →
jack128 © (2004-03-09 22:32) [4]сорри, естественно
if (AppExample <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
← →
DelphiN! © (2004-03-09 23:09) [5]> jack128 У меня не работает:)
AppExample:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"Map1");
Base:=MapViewOfFile(AppExample,FILE_MAP_READ,0,0,0);
UnMapViewOfFile(Base);
CloseHandle(AppExample);
AppExample:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"Map1");
if (AppExample <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
showmessage("Already_exists")
else
begin
showmessage("ok");
CloseHandle(AppExample);
end;
После выполнения Сообщение Already_exists
А вообще если программа будет иметь следующий код:AppExample:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"Map1");
if GetLastError = ERROR_ALREADY_EXISTS then
halt;
То если в системе больше нет ее копий она запуститься, если же есть то произойдет halt. Если мы закроем и откроем программу, то она запуститься нормально, из этого следует что память маппированного файла освободилась после закрытия. Так вот мне нужно добиться такого-же эффекта освобождения памяти маппированного файла, как и при закрытии программы, но естественно не закрывая ее :-). Выполнение кодаAppExample:= CreateFileMapping($ffffffff,nil, PAGE_READONLY,0,32,"Map1");
Base:=MapViewOfFile(AppExample,FILE_MAP_READ,0,0,0);
UnMapViewOfFile(Base);
CloseHandle(AppExample);
такого эффекта ксожалению не дает, так вот как мне добиться этого?
← →
jack128 © (2004-03-10 00:04) [6]Советую пойти в шаманы.. ;-)
Или посмотреть, что возвращает CloseHandle (при первом вызове)
← →
DelphiN! © (2004-03-10 20:16) [7]Оказывается в моем 1-ом варианте все работало :-)
Просто я забыл из памяти Длл убрать, которая при освобождении мэпа его заного забивала
Вобщем большое сорри за рассеяность :)
Страницы: 1 вся ветка
Текущий архив: 2004.03.28;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.037 c