Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MapFIle [D6, WinXP]


_наблюдатель_ ©   (2004-01-10 21:11:00) 

Здравствуйте дорогие сотоварищи-сограждане. Есть у меня такая вот проблемка. Есть сервис, в котором используется MapFile (незнаю как по русски). Вообщем через этот MapFile он (сервис) должен общаться с разными прогами, использующими тот же MapFile. Прикол в том, что в этих прогах MapFile, после запуска сервера не создаётся, и в результате вызова CreateFileMapping возвращается не HANDLE на уже созданный MapFile, а 0(ноль). Но ведь если код по созданию MapFile в сервисе вытащить и воткнуть в простую программу, то она (простая программа) спокойно общается с другими через этот MapFile, а вот при создании его в сервисе, ничего не выходит.
Кто знает в чём тут ошибка, помогите пожалуйста.

Вот код для создания MapFile. Может я где ошибся?

......
const MMFName='Service_Map_File';

type
 PBufDat=^TBufDat;
 TBufDat=packed record
  Operation:byte;
  Command:array [0..Max_Path] of char;
  Result:string;
 end;

var rBufDat:PBufDat=nil;
   hMapObject:THandle=0;
......
hMapObject:=CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TBufDat), MMFName);
if hmapobject=0 then listbox1.items.add ('Error... Create');

rBufDat:=MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TBufDat));
if rbufdat=nil then listbox1.items.add ('Error... Map');
......


_наблюдатель_   (2004-01-12 21:03:00) [1]

Огромное вам спасибо, дорогой товарищ. Впредь будет мне уроком дочитывать всю справку до конца!


Бином Ньютоныч   (2004-01-12 17:18:00) [2]

>Просто bInheritHandle я поэкспериментировал, ничего не вышло.

Из чего делаю вывод, что ты - русский, и документацию не читаешь:) Зря, однако...
SecurityDescriptor определяет, кто имеет доступ к объекту. Соответственно нужно проинициировать дескриптор, привязав к нему список SID пользователей с соответствующими масками прав. Это путь ПРАВИЛЬНЫЙ. А есть еще путь ЛЕГКИЙ: передать дескриптор с "нулевым" списком:

function GetNullDescriptor: PSecurityDescriptor;
begin
 Result:=CoTaskMemAlloc(SizeOf(TSecurityDescriptor));
 if Result = nil then Exit;
 if
   not InitializeSecurityDescriptor(Result, SECURITY_DESCRIPTOR_REVISION) or
   not SetSecurityDescriptorDacl(Result, true, nil, false)
 then
 begin
   CoTaskMemFree(Result);
   Result:=nil;
 end;
end;

и в чистом виде передаешь в функцию. Тогда к объекту будут иметь доступ все без исключения, т.е. никакой защиты не будет.


_наблюдатель_   (2004-01-11 17:54:00) [3]

Как я понял, надо поработать с lpSecurityDescriptor. Но чего ему указать я не понял.
Может подскажите. Просто bInheritHandle я поэкспериментировал, ничего не вышло.


Бином Ньютоныч   (2004-01-10 22:28:00) [4]

>Может я где ошибся?
Во втором параметре CreateFileMapping


Наверх

Титульная страница Поиск, карта сайта Написать письмо