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

Вниз

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

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

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

Наверх





Память: 0.5 MB
Время: 0.049 c
6-1101368472
Жуков
2004-11-25 10:41
2005.03.20
Сообщения по локальной сети


14-1109455157
Vasya.ru
2005-02-27 00:59
2005.03.20
Воскресные задачки


1-1109954622
muhan
2005-03-04 19:43
2005.03.20
Как создать кнопку


1-1109933326
MTsv DN
2005-03-04 13:48
2005.03.20
LIB -> OBJ


1-1110022457
Goga
2005-03-05 14:34
2005.03.20
Отправка сообщения





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский