Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с OpenFileMapping - Не удается найти указанный файл [WinXP]


__max__ ©   (2005-02-10 10:37:00) 

Имеется некое приложение и некая библиотека. Сначала библиотека делает так:
HANDLE hMap = NULL;
hMap = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 1024, "MyMapName"); // возвращает описатель, все нормально здесь ошибки не будет

Потом некое приложение делает так:

HANDLE hMap = NULL;
TCHAR s[50];

hMap = OpenFileMapping (FILE_MAP_ALL_ACCESS, TRUE, "MyMapName"); // вот здесь возвращается NULL
sprintf(s, "ERROR #%d", GetLastError());
MessageBox(0, s, "Error!", 16);

Выдается ошибка #2 => Не удается найти указанный файл. Почему??? (SP2, MSVC++.NET)


Digitman   (2005-02-10 15:21:00) [1]


> Но теперь я понял свою ошибку - процесс 1 как только завершается
> закрывает все хэндлы


уфф... аминь ! ...


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


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


Владислав   (2005-02-10 15:14:00) [2]

SendMessage и WM_COPYDATA не спасут?


__max__   (2005-02-10 15:02:00) [3]


> Alexander Panov ©   (10.02.05 11:59) [7]
> Первый процесс должен ждать, пока не отработает второй.
> Только и всего.


Что значит только и всего? У меня первый процесс- это библиотека. Выгрузка этой библиотеки происходит только тогда когда прорцесс к которому она прицепилась(хук короче) будет закрыт. В момент выгрузки (DLL_PROCESS_DETACH) происходит создание проекции файла
HANDLE hMap = NULL;
hMap = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SomeSize, "MyMapName"); // возвращает описатель, все нормально здесь ошибки не будет

Потом выполняется MapViewOfFile, копируется в эту проекцию некая строка размер которой может быть совершенно разным (KEYBOARD HOOK)
Процесс второй -это мое клиентское приложение которое ждет пока не завершиться процесс 1(то-есть процесс в который загружениа библиотека). Приложение как только узнав что процесс 1 был завершен, выполняет следующее:
hMap = OpenFileMapping (FILE_MAP_ALL_ACCESS, TRUE, "MyMapName"); // вот здесь возвращается NULL
sprintf(s, "ERROR #%d", GetLastError());
MessageBox(0, s, "Error!", 16);


Но теперь я понял свою ошибку - процесс 1 как только завершается закрывает все хэндлы. Но как мне тогда быть, если мне нужно узнать строку которую я спроецировал? Конечно можно просто создавать промежуточные файлы, но это IMHO не очень красивая реализация. У вас есть какие-либо идеи по поводу данной проблемы


Digitman   (2005-02-10 12:24:00) [4]


> __max__  


что значит "Ну да так и есть" ?

в случаях если ИЛИ

- 1-й процесс, создавший MMF, завершается раньше чем 2-й процесс попытается открыть MMF

ИЛИ

- 1-й процесс, создавший MMF, завершается НЕ раньше чем 2-й процесс попытается открыть MMF, но явно уничтожит MMF-объект раньше чем 2-й процесс попытается открыть этот MMF

тебе обеспечен именно тот геморрой, который ты сейчас схлопотал


Alexander Panov   (2005-02-10 11:59:00) [5]

__max__   (10.02.05 11:56) [6]
Ну да так и есть, а чего от этого зависит да? А как тогда быть?

Первый процесс должен ждать, пока не отработает второй. Только и всего.


__max__   (2005-02-10 11:56:00) [6]

Digitman ©   (10.02.05 11:37) [3]


> странно .. вроде бы явных предпосылок к отказу из приведенного
> кода не видно ..
>
> а может первый процесс у тебя завершается еще ДО того как
> второй пытается открыть MMF ?


Ну да так и есть, а чего от этого зависит да? А как тогда быть?


__max__   (2005-02-10 11:56:00) [7]

Digitman ©   (10.02.05 11:37) [3]


> странно .. вроде бы явных предпосылок к отказу из приведенного
> кода не видно ..
>
> а может первый процесс у тебя завершается еще ДО того как
> второй пытается открыть MMF ?


Ну да так и есть, а чего от этого зависит да? А как тогда быть?


Alexander Panov   (2005-02-10 11:42:00) [8]

Digitman ©   (10.02.05 11:37) [3]
насчет тек.каталога это ты загнул ..


Это точно, загнул.

Код автора вопроса у меня работает без изменений без ошибок.
Но у меня W2000, и пользователь - администратор


Digitman   (2005-02-10 11:37:00) [9]


> Alexander Panov ©   (10.02.05 10:39) [1]


насчет тек.каталога это ты загнул ..


> __max__  


странно .. вроде бы явных предпосылок к отказу из приведенного кода не видно ..

а может первый процесс у тебя завершается еще ДО того как второй пытается открыть MMF ?

и, кстати, чем обоснован 2-й параметр = True ?


__max__   (2005-02-10 10:55:00) [10]

Alexander Panov ©   (10.02.05 10:39) [1]

Я поставил SetCurrentDirectory("c:\\"); перед CreateFileMapping в библиотеке, и перед OpenFileMapping в приложении, результата не дало :( А вообще я незнал что в данном случае надо учитывать текущие каталоги, я думал для таких "проецируемых файлов" есть специальный каталог определенный Windows.


Alexander Panov   (2005-02-10 10:39:00) [11]

А почему ты думаешь, что для приложения, который выполняет OpenFileMapping текущий каталог тот же, что и для первого?


Наверх

Титульная страница Поиск, карта сайта Написать письмо