Форум: "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