![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OpenFileMapping не работает под win2000 [D7, Win2k, WinXP]
m52 © (2006-08-27 07:47:00)Почитал много способов передачи данных м/у приложениями с использованием объектов ядра: 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;
Ketmar (2006-08-28 02:23:00) [1]> [9] Fay © (28.08.06 02:08)
а ещё можно не заморачиваться с этим там, где оно не надо. %-)
Fay (2006-08-28 02:08:00) [2]2 Ketmar © (28.08.06 2:00) [8]
А можно просто считать, что именно 64.
Ketmar (2006-08-28 02:00:00) [3]кстати, "гранулярность" -- это размер страницы, я так понял? который может быть и 4 кб. %-)
Fay (2006-08-28 01:56:00) [4]2 m52 (27.08.06 20:18) [4]
> 64 К - это гранулярность операционок
64K - чётное число, а 65535 - не очень
guav (2006-08-27 22:59:00) [5]> это величина, кратно которой
> нужно указывать параметры для смещения и длины буфера
Это не касается длины, только для смещения. Указывать в 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.", для этих флагов использование "+" будет ошибкой при их значениях $80 880000 и $ C00000.
> > PS: Советую использовать структурированную обработку исключений
> и функции Win32Check, RaiseLastWin32Error.
>
> Покажите пример, как это делается. Ни разу не пользовался
> этими функциями.
Для того чтобы правильно пользоваться этими функциями, необходимо понимать структурированную обработку исключений (ключевые слова try, except, finally и raise). Если Вы знакомы с SEH, то понять работу и назначение этих функций несложно по их коду.
Ketmar (2006-08-27 20:27:00) [6]> [4] m52 (27.08.06 20:18)
> Почему иногда пишут INVALID_HANDLE_VALUE?
потому что отцы-основатели так говорят делать.
> Таит ли в себе угрозу использование знака "+", а не "or"?
такую же, как использование чисел вместо констант. вот возьмут -- и поменяют константы. и совпадут два единичных бита. и "+" сделает неизвестно что.
m52 (2006-08-27 20:18:00) [7]Спасибо большое!!! 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.
Покажите пример, как это делается. Ни разу не пользовался этими функциями.
Fay (2006-08-27 18:47:00) [8]По мелочам...
Не HWND($FFFFFFFF), а INVALID_HANDLE_VALUE
Не MB_OK+MB_ICONERROR, а MB_OK or MB_ICONERROR
P.S.
Почему dwMaximumSizeLow именно 2*65535 ?
guav (2006-08-27 15:27:00) [9]Win API функции при успешном выполнении не обязаны устанавливать "LastError" в 0 (кроме случаев, где это явно указано).
Т.е. еслиhMappedFile := OpenFileMapping(...');вернёт валидный hMappedFile, то GetLastError проверять не следует, он может содержать и предыдущую ошибку.
PS: Советую использовать структурированную обработку исключений и функции Win32Check, RaiseLastWin32Error.
m52 (2006-08-27 07:48:00) [10]Поправочка: в приложении1 в CreateFileMapping 2-й параметр не @sa, а nil