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

Вниз

Проблемы с разделяемой памятью   Найти похожие ветки 

 
Homesad ©   (2005-02-04 14:04) [0]

Ребята, нужна помощь.
Вобщем надо чтобы две копии одного консольного процесса,
имели доступ по записи к общему участку памяти.
Программу я писал на VirtualPascale. (ОС - Windows 2003 Server).
Тот фрагмент который вызывает проблему я для простоты
переписал на Delphi 6. Вот полный ее текст.

{$APPTYPE CONSOLE}
uses Windows,SysUtils;
VAR Api,nApi : Pointer;
   hApi,nhApi :word;
   ApiName  : Pchar;

Begin
ApiName:="Test";
hApi:=CreateFileMapping($FFFFFFFF,Nil,PAGE_READWRITE,0,1,ApiName);
writeln(GetLastError," - ",hApi);
Api:=MapViewOfFile(hApi,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0);
writeln(GetLastError," - ",Dword(Api));
readln;
nhApi:=OpenFileMapping(PAGE_READWRITE,false,ApiName);
writeln(GetLastError," - ",nhApi);
nApi:=MapViewOfFile(nhApi,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0); // !!!!!!!!!!!!!!!
writeln(GetLastError," - ",Dword(nApi));
readln;
UnMapViewOfFile(nApi);
CloseHandle(nhApi);
UnMapViewOfFile(Api);
CloseHandle(hApi);
End.

После строчки с восклицательными знаками,
GetLastError = 5 - доступ запрещен.
Если оставляю только параметр FILE_MAP_READ, то
все в порядке, но ведь мне запись в общую память нужна!!!
Вроде все делаю как написано, вобщем я в тупике, подскажите
что не так. Или может посоветуете какой-нибудь другой способ,
обмена данными между двумя процессами ???


 
Eraser ©   (2005-02-04 14:11) [1]

Homesad ©
Или может посоветуете какой-нибудь другой способ,
обмена данными между двумя процессами


Какого плана у тебя приложение? Может ли в обозимом будущем возникнуть необходимость разделения этих процессов на разные машины?
Какое кол-во данных передаётся (много/мало (кб/с))?


 
Игорь Шевченко ©   (2005-02-04 14:21) [2]

Program Files\Borland\Delphi\Demos\IpcDemos\*.*


 
Digitman ©   (2005-02-04 14:29) [3]


> Или может посоветуете какой-нибудь другой способ,
> обмена данными между двумя процессами ???


посоветую.
Named Pipes этот "способ" зовется


 
BlackTr   (2005-02-04 15:04) [4]


> nhApi:=OpenFileMapping(PAGE_READWRITE,false,ApiName);

nhApi:=CreateFileMapping($FFFFFFFF,Nil,PAGE_READWRITE,0,1,ApiName);
и все должно работать...


> обмена данными между двумя процессами ???

По коду у тебя один процесс :)


 
alpet   (2005-02-04 16:33) [5]

Если планируется запускать несколько копий одного процесса, сначала вызывается OpenFileMapping, и если она возвращает ошибку вызвается CreateFileMapping, и только потом MapViewOfFile.


 
Piter ©   (2005-02-04 16:40) [6]

Homesad ©   (04.02.05 14:04)
hApi,nhApi :word;


не word, а DWORD должен быть. Непонятно, как компилятор не удивляется

Homesad ©   (04.02.05 14:04)
Api:=MapViewOfFile(hApi,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0);


попробуй вместо этого FILE_MAP_ALL_ACCESS

Homesad ©   (04.02.05 14:04)
nhApi:=OpenFileMapping(PAGE_READWRITE,false,ApiName);
writeln(GetLastError," - ",nhApi);
nApi:=MapViewOfFile(nhApi,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0); // !!!!!!!!!!!!!!!


а это строчки зачем? Ты хоть бы справку почитал про CreateFileMapping:

"The handle that CreateFileMapping returns has full access to the new file-mapping object"

Не нужно никакого OpenFileMapping после этого...


 
Piter ©   (2005-02-04 17:00) [7]

alpet   (04.02.05 16:33) [5]
Если планируется запускать несколько копий одного процесса, сначала вызывается OpenFileMapping, и если она возвращает ошибку вызвается CreateFileMapping


зачем? Почему сразу не сделать CreateFileMapping?


 
Игорь Шевченко ©   (2005-02-04 17:07) [8]

Piter ©   (04.02.05 16:40) [6]


> попробуй вместо этого FILE_MAP_ALL_ACCESS


И нафига, собственно ?


 
alpet   (2005-02-04 17:23) [9]

Почему сразу не сделать CreateFileMapping?
Два одинковых процесса смогут использовать проекцию, если открывать ее с помощью OpenFileMapping.
Если ее создать дважды последняя попытка провалится, как написано в MSDN: If the object existed before the function call, the function returns a handle to the existing object (with its current size, not the specified size) and GetLastError returns ERROR_ALREADY_EXISTS.


 
BlackTr   (2005-02-04 17:25) [10]


> Если ее создать дважды последняя попытка провалится, как
> написано в MSDN: If the object existed before the function
> call, the function returns a handle to the existing object
> (with its current size, not the specified size) and GetLastError
> returns ERROR_ALREADY_EXISTS.


Сам хоть понял, что тут написано ???
Если существует, то вернет handle существующего...
Так, что OpenFileMapping нафиг не нужен :)


 
BiN ©   (2005-02-04 17:29) [11]

Проблема налицо - в MapViewOfFile передается неверное значение описателя MMF по причине, указанной Piter-ом в первой части [6]


 
alpet   (2005-02-04 17:32) [12]

[i]Так, что OpenFileMapping нафиг не нужен :)[/i]
Точно. Я весьма не внимателен :-(


 
BlackTr   (2005-02-04 17:44) [13]

Подумал, а почему OpenFileMapping неработает ?
Только счас дошло:
должно быть не nhApi:=OpenFileMapping(PAGE_READWRITE,false,ApiName);
а nhApi:=OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE,false,ApiName);
:)))


 
alpet   (2005-02-04 18:01) [14]

Сталкивался с тем же на днях, когда под билдер делал демку. Правда проблему решил пересмотрев старые исходники.


 
Piter ©   (2005-02-04 19:03) [15]

Игорь Шевченко ©   (04.02.05 17:07) [8]
> попробуй вместо этого FILE_MAP_ALL_ACCESS

И нафига, собственно ?


да я только предположил. Просто бегло взглянув на file_map_all_access, увидел достаточно сложную комбинацию флагов:

(STANDARD_RIGHTS_REQUIRED or SECTION_QUERY or
   SECTION_MAP_WRITE or SECTION_MAP_READ or SECTION_MAP_EXECUTE or SECTION_EXTEND_SIZE);


а не просто чтение/запись/выполнение. поэтому и подумалось - вдруг в этом дело... это было всего лишь предположение...


 
Homesad ©   (2005-02-04 23:31) [16]

Огромное спасибо BlackTr

nhApi:=CreateFileMapping($FFFFFFFF,Nil,PAGE_READWRITE,0,1,ApiName);
Дало тот результат который мне нужен.

>> По коду у тебя один процесс :)
Да по коду у меня один процесс, но это я сделал для отладки.
На самом деле это консольная программа, для приема-передачи
гидрометеоинформации по COM-порту. Скорость обычно 100-200 бод.
Первая копия запускается и работает если выражатся терминами
DOS в резидентном режиме, обеспечивая прием данных, и в том
числе создает обьект разделяемой памяти. Вторая копия программы
запущенная из любого файл-менеджера с определенными ключами,
передает указанный в параметрах файл 1-й копии для его передачи
в канал, вот для чего мне нужна была Ваша помощь.
Вобщем еще раз огромное спасибо, а то не мог продолжить работу,
над этим нужным проектом для нашей сети гидрометеостанций.
Родина Вас не забудет, (меня может быть тоже :-) ).
Я работаю на острове Диксон, нам всего три месяца назад дали,
доступ в инет, наверное севернее его уже нигде нет,канал очень
слабенький 14 kbs и меньше, но это уже все таки что-то.
Десять лет работать здесь и только лишь знать (но не видеть
и не использовать все преимущества доступа в инет) это для
человека связанного с компьютерами почти пытка.
Простите что так много всего наговорил, просто эмоции подкатили.
Еще задам маленький вопрос, это уже не срочно, так мне для
общего развития, можно и если да то как из консольного окна
вызвать функцию GetOpenFileName, так чтобы она выскакивала
на передний план, а то она выходит где-то под другими окнами.
С функцией MessageBox у меня тоже так было пока я флаг
MB_SYSTEMMODAL не поставил.



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

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

Наверх




Память: 0.51 MB
Время: 0.052 c
4-1107837128
Grief
2005-02-08 07:32
2005.03.20
Popup Menu


1-1109845180
DICE
2005-03-03 13:19
2005.03.20
Про графики


1-1109767666
Васек1
2005-03-02 15:47
2005.03.20
Значение по умолчанию в поле fkCalculated


6-1106410897
ferr
2005-01-22 19:21
2005.03.20
idTCP


1-1110029514
Peter_cc
2005-03-05 16:31
2005.03.20
Служба!help!