Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];

Вниз

OpenFileMapping не работает под win2000   Найти похожие ветки 

 
m52   (2006-08-27 07:47) [0]

Почитал много способов передачи данных м/у приложениями с использованием объектов ядра: FileMapping, Mutex, DDE, ...

Больше всего понравился способ с FileMapping.
Под WinXP,win2003Server работает отлично, но под win2000 есть проблема: запускаю приложение1, затем - приложение2. Во втором приложении в OpenFileMapping выдает ошибку: "1411 - Класс не существует"
{ Class does not exist. }
ERROR_CLASS_DOES_NOT_EXIST = 1411;
{$EXTERNALSYM ERROR_CLASS_DOES_NOT_EXIST}

Что бы это значило? Может кто подскажет? В WinXP все работает нормально.

В приложении1 делаю так:

 { Попытаемся создать файл в файле подкачки Swap - $FFFFFFFF}
 hMappedFile := CreateFileMapping(HWND($FFFFFFFF), @sa, PAGE_READWRITE, 0, 2*65535, "bs_mess_file");
 win32err:=GetLastError;
 if (win32err<>0)and(win32err<>ERROR_ALREADY_EXISTS) then
 begin
   Application.MessageBox(PChar("Произошла ошибка CreateFileMapping. "+#13#10+ SysErrorMessage(win32err))," Внимание!",MB_OK+MB_ICONERROR);
   exit;
 end;
 // Если файл в памяти уже существует, то hMappedFile будет указывать на него

 // спроецировать данные swap-файла в адресное пространство нашего процесса (памяти)
 pSharedBuf := MapViewOfFile(hMappedFile, FILE_MAP_READ or FILE_MAP_WRITE, 0, 0, 0) ;
 win32err:=GetLastError;
 if win32err<>0 then
 begin
   Application.MessageBox(PChar("Произошла ошибка MapViewOfFile для pSharedBuf. "+#13#10+ SysErrorMessage(win32err))," Внимание!",MB_OK+MB_ICONERROR);
   exit;
 end;
 if (pSharedBuf = nil) then
 begin
   Application.MessageBox(PChar("MapViewOfFile вернула NULL для pSharedBuf")," Внимание!",MB_OK+MB_ICONERROR);
   exit;
 end;


В программе 2 делаю так:

 hMappedFile := OpenFileMapping(FILE_MAP_READ or FILE_MAP_WRITE, false, "bs_mess_file");
 win32err:=GetLastError;
 if (win32err<>0)and(win32err<>ERROR_FILE_NOT_FOUND) then
 begin
   Application.MessageBox(PChar("Произошла ошибка. ErrorCode: "+IntToStr(win32err)+#13#10+ SysErrorMessage(win32err))," Внимание!",MB_OK+MB_ICONERROR);
   exit;
 end;


 
m52   (2006-08-27 07:48) [1]

Поправочка: в приложении1 в CreateFileMapping 2-й параметр не @sa, а nil


 
guav ©   (2006-08-27 15:27) [2]

Win API функции при успешном выполнении не обязаны устанавливать "LastError" в 0 (кроме случаев, где это явно указано).
Т.е. если  hMappedFile := OpenFileMapping(..."); вернёт валидный hMappedFile, то GetLastError проверять не следует, он может содержать и предыдущую ошибку.

PS: Советую использовать структурированную обработку исключений и функции Win32Check, RaiseLastWin32Error.


 
Fay ©   (2006-08-27 18:47) [3]

По мелочам...
Не HWND($FFFFFFFF), а INVALID_HANDLE_VALUE
Не MB_OK+MB_ICONERROR, а MB_OK or MB_ICONERROR

P.S.
Почему dwMaximumSizeLow именно 2*65535 ?


 
m52   (2006-08-27 20:18) [4]

Спасибо большое!!! guav, Вы оказались правы насчет GetLastError.


> Не HWND($FFFFFFFF), а INVALID_HANDLE_VALUE


Вот насчет этого как раз хотел спросить. Почему иногда пишут INVALID_HANDLE_VALUE? Это же переводится как "неверные хэндл"?


> Не MB_OK+MB_ICONERROR, а MB_OK or MB_ICONERROR

Очень интересно. Поясните разницу, если есть. Таит ли в себе угрозу использование знака "+", а не "or" ?


> Почему dwMaximumSizeLow именно 2*65535 ?

64 К - это гранулярность операционок. Это число я на самом деле получаю функцией GetSystemInfo. 64К - это величина, кратно которой
нужно указывать параметры для смещения и длины буфера в MapViewOfFile, ну и в CreateFileMapping я на всякий случай указал кратно 64К. Для MapViewOfFile мне это не обходимо потому, что в реальном проекте я создаю файл в памяти, а с помощью MapViewOfFile мапирую 1/2 файла и 1/2 файла отдельно. Одну половину файла использую для передачи данных приложение1->приложени2, а вторую - наоборот, от приложение2->приложению1.


> PS: Советую использовать структурированную обработку исключений и функции Win32Check, RaiseLastWin32Error.


Покажите пример, как это делается. Ни разу не пользовался этими функциями.


 
Ketmar ©   (2006-08-27 20:27) [5]

> [4] m52   (27.08.06 20:18)
> Почему иногда пишут INVALID_HANDLE_VALUE?
потому что отцы-основатели так говорят делать.

> Таит ли в себе угрозу использование знака "+", а не "or"?
такую же, как использование чисел вместо констант. вот возьмут -- и поменяют константы. и совпадут два единичных бита. и "+" сделает неизвестно что.


 
guav ©   (2006-08-27 22:59) [6]

> это величина, кратно которой
> нужно указывать параметры для смещения и длины буфера

Это не касается длины, только для смещения. Указывать в CreateFileMapping можно столько, сколько для приложения требуется.


> Одну половину файла использую для передачи данных приложение1-
> >приложени2, а вторую - наоборот, от приложение2->приложению1.

Скорее всего, или такое разделение лишнее, или для этого случая лучше подходят другие способы взаимодействия приложений, например, Pipes.


> Таит ли в себе угрозу использование знака "+", а не "or"
> ?

Таит. К тому, что сообщил [5] Ketmar ©   (27.08.06 20:27) могу добавить что не следует складывать флаги, что бы не привыкать так делать.
Например, цитата из справки по CreateWindow "The WS_CAPTION and WS_POPUPWINDOW styles must be combined to make the window menu visible." , для этих флагов использование "+" будет ошибкой при их значениях $80880000 и $C00000.


> > PS: Советую использовать структурированную обработку исключений
> и функции Win32Check, RaiseLastWin32Error.
>
> Покажите пример, как это делается. Ни разу не пользовался
> этими функциями.


Для того чтобы правильно пользоваться этими функциями, необходимо понимать структурированную обработку исключений (ключевые слова try, except, finally и raise). Если Вы знакомы с SEH, то понять работу и назначение этих функций несложно по их коду.


 
Fay ©   (2006-08-28 01:56) [7]

2 m52   (27.08.06 20:18) [4]
> 64 К - это гранулярность операционок
64K - чётное число, а 65535 - не очень


 
Ketmar ©   (2006-08-28 02:00) [8]

кстати, "гранулярность" -- это размер страницы, я так понял? который может быть и 4 кб. %-)


 
Fay ©   (2006-08-28 02:08) [9]

2 Ketmar ©   (28.08.06 2:00) [8]
А можно просто считать, что именно 64.


 
Ketmar ©   (2006-08-28 02:23) [10]

> [9] Fay ©   (28.08.06 02:08)
а ещё можно не заморачиваться с этим там, где оно не надо. %-)



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
15-1165998355
infom
2006-12-13 11:25
2007.01.07
Backup Delphi со всеми компонентами


2-1166366846
Bolt
2006-12-17 17:47
2007.01.07
Резервирование


2-1166459366
ezorcist
2006-12-18 19:29
2007.01.07
узнать IP адреса всех ПК в локальной сети?


4-1154781641
fufel
2006-08-05 16:40
2007.01.07
drag i drop | delphi i iexplorer


2-1166420953
Alex_AA
2006-12-18 08:49
2007.01.07
Помогите удалить картинку с Image





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский