![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с 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 текущий каталог тот же, что и для первого?