Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
ВнизПроблемы с OpenFileMapping - Не удается найти указанный файл Найти похожие ветки
← →
__max__ (2005-02-10 10:37) [0]Имеется некое приложение и некая библиотека. Сначала библиотека делает так:
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)
← →
Alexander Panov © (2005-02-10 10:39) [1]А почему ты думаешь, что для приложения, который выполняет OpenFileMapping текущий каталог тот же, что и для первого?
← →
__max__ (2005-02-10 10:55) [2]Alexander Panov © (10.02.05 10:39) [1]
Я поставил SetCurrentDirectory("c:\\"); перед CreateFileMapping в библиотеке, и перед OpenFileMapping в приложении, результата не дало :( А вообще я незнал что в данном случае надо учитывать текущие каталоги, я думал для таких "проецируемых файлов" есть специальный каталог определенный Windows.
← →
Digitman © (2005-02-10 11:37) [3]
> Alexander Panov © (10.02.05 10:39) [1]
насчет тек.каталога это ты загнул ..
> __max__
странно .. вроде бы явных предпосылок к отказу из приведенного кода не видно ..
а может первый процесс у тебя завершается еще ДО того как второй пытается открыть MMF ?
и, кстати, чем обоснован 2-й параметр = True ?
← →
Alexander Panov © (2005-02-10 11:42) [4]Digitman © (10.02.05 11:37) [3]
насчет тек.каталога это ты загнул ..
Это точно, загнул.
Код автора вопроса у меня работает без изменений без ошибок.
Но у меня W2000, и пользователь - администратор
← →
__max__ (2005-02-10 11:56) [5]Digitman © (10.02.05 11:37) [3]
> странно .. вроде бы явных предпосылок к отказу из приведенного
> кода не видно ..
>
> а может первый процесс у тебя завершается еще ДО того как
> второй пытается открыть MMF ?
Ну да так и есть, а чего от этого зависит да? А как тогда быть?
← →
__max__ (2005-02-10 11:56) [6]Digitman © (10.02.05 11:37) [3]
> странно .. вроде бы явных предпосылок к отказу из приведенного
> кода не видно ..
>
> а может первый процесс у тебя завершается еще ДО того как
> второй пытается открыть MMF ?
Ну да так и есть, а чего от этого зависит да? А как тогда быть?
← →
Alexander Panov © (2005-02-10 11:59) [7]__max__ (10.02.05 11:56) [6]
Ну да так и есть, а чего от этого зависит да? А как тогда быть?
Первый процесс должен ждать, пока не отработает второй. Только и всего.
← →
Digitman © (2005-02-10 12:24) [8]
> __max__
что значит "Ну да так и есть" ?
в случаях если ИЛИ
- 1-й процесс, создавший MMF, завершается раньше чем 2-й процесс попытается открыть MMF
ИЛИ
- 1-й процесс, создавший MMF, завершается НЕ раньше чем 2-й процесс попытается открыть MMF, но явно уничтожит MMF-объект раньше чем 2-й процесс попытается открыть этот MMF
тебе обеспечен именно тот геморрой, который ты сейчас схлопотал
← →
__max__ (2005-02-10 15:02) [9]
> 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 не очень красивая реализация. У вас есть какие-либо идеи по поводу данной проблемы
← →
Владислав © (2005-02-10 15:14) [10]SendMessage и WM_COPYDATA не спасут?
← →
Digitman © (2005-02-10 15:21) [11]
> Но теперь я понял свою ошибку - процесс 1 как только завершается
> закрывает все хэндлы
уфф... аминь ! ...
> Но как мне тогда быть, если мне нужно узнать строку которую
> я спроецировал?
между прочим, MMF-механизм был придуман хотя бы для интерпроцессного взаимодействия в части использования разделяемых несколькими процессами одновременно ресурсов памяти ... и о каком же интерпроцессном взаимодействии может идти речь, когда у тебя в каждый момент времени существует всего один заинтересованный в ресурсе процесс ?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.036 c