Форум: "Система";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Вниз
MapFIle Найти похожие ветки
← →
_наблюдатель_ (2004-01-10 21:11) [0]Здравствуйте дорогие сотоварищи-сограждане. Есть у меня такая вот проблемка. Есть сервис, в котором используется 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-10 22:28) [1]>Может я где ошибся?
Во втором параметре CreateFileMapping
← →
_наблюдатель_ (2004-01-11 17:54) [2]Как я понял, надо поработать с lpSecurityDescriptor. Но чего ему указать я не понял.
Может подскажите. Просто bInheritHandle я поэкспериментировал, ничего не вышло.
← →
Бином Ньютоныч (2004-01-12 17:18) [3]>Просто 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-12 21:03) [4]Огромное вам спасибо, дорогой товарищ. Впредь будет мне уроком дочитывать всю справку до конца!
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.034 c