Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1110384707
1010111000110101110
2005-03-09 19:11
2005.03.20
Delphi 8 for .NET и обычный Windows - нельзя?


1-1110087607
TeNY
2005-03-06 08:40
2005.03.20
Dokymeнтация на WEBbrouser,Где можно найти?


1-1110041315
Leeechhhh
2005-03-05 19:48
2005.03.20
Как сделать чтоб длинна формы равнялась длинне строки


3-1108617284
Submarine
2005-02-17 08:14
2005.03.20
Проблемка с выбором последней записи


14-1109743450
Чеширский_Кот
2005-03-02 09:04
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский