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

Вниз

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 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.052 c
2-1166521831
Slimer
2006-12-19 12:50
2007.01.07
Печать таблицы с неопределенными столбцами


15-1166102408
Vlad Oshin
2006-12-14 16:20
2007.01.07
SQL. where 1=2 Это зачем так писать?


2-1166099285
FIL-23
2006-12-14 15:28
2007.01.07
жадный цыкл


15-1166076363
Tab
2006-12-14 09:06
2007.01.07
RX Library


15-1165953376
oxffff
2006-12-12 22:56
2007.01.07
Вопрос для Cyraxa. Как модифицировать GOF паттерн Visitor