![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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