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

Вниз

Проблемы с 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 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.078 c
1-1110099467
Checist [root]
2005-03-06 11:57
2005.03.20
Maximized form


1-1109795025
starlit
2005-03-02 23:23
2005.03.20
как узнать что мышка ушла с объекта - Panel1?


1-1109880961
Димон
2005-03-03 23:16
2005.03.20
Вопрос


14-1109524986
ve7al
2005-02-27 20:23
2005.03.20
Язык программирования Паскаль


14-1109613139
Petr V. Abramov
2005-02-28 20:52
2005.03.20
Ну хоть одной внешней угрозой стало меньше....