问题是这样子的
两个程序 A 和 BA: 是一个系统服务程序 随系统启动而运行
创建了一个内存映像
hmapping := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
SizeOf(MyData),
PChar('ShareMem')); B:是一个普通应用程序
在用openfilemapping 定位到内存映像时出错,我查了错误代码是: 拒绝访问 MapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False,
PChar('ShareMemMap'));问问诸位高手如何解决呢?
两个程序 A 和 BA: 是一个系统服务程序 随系统启动而运行
创建了一个内存映像
hmapping := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
SizeOf(MyData),
PChar('ShareMem')); B:是一个普通应用程序
在用openfilemapping 定位到内存映像时出错,我查了错误代码是: 拒绝访问 MapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False,
PChar('ShareMemMap'));问问诸位高手如何解决呢?
MapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False,
PChar('ShareMem'));
hFileMapping: THandle;
sa: SECURITY_ATTRIBUTES;
sd: SECURITY_DESCRIPTOR;begin
hFileMapping := OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, PChar('MyShareMem'));
if hFileMapping = 0 then
begin
// 设置权限
InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@sd, TRUE, nil, FALSE);
FillChar(sa, sizeof(SECURITY_ATTRIBUTES), 0);
sa.bInheritHandle := FALSE;
sa.lpSecurityDescriptor := @sd;
sa.nLength := sizeof(SECURITY_ATTRIBUTES); hFileMapping := CreateFileMapping(INVALID_HANDLE_VALUE, @sa, PAGE_READWRITE or SEC_COMMIT, 0, FSize, PChar(MyShareMem));
end;
end;
名字没错~我打字打错了~
GetLastError返回值是:5 拒绝访问
都是在admin账户下编译的
procedure TFileMap.OpenMap;
var
sa: SECURITY_ATTRIBUTES;
sd: SECURITY_DESCRIPTOR;
begin
if (FMapHandle = 0) and (FMapPointer = nil) then
begin
FExistsAlready := False; InitializeSecurityDescriptor(@sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@sd, True, nil, False);
sa.nLength := sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle := True;
sa.lpSecurityDescriptor := @sd;
FMapHandle := CreateFileMapping(INVALID_HANDLE_VALUE, @sa, PAGE_READWRITE, 0, FSize, PChar(MAPNAME));
if (FMapHandle = INVALID_HANDLE_VALUE) or (FMapHandle = 0) then exit;
if (FMapHandle <> 0) and (GetLastError = ERROR_ALREADY_EXISTS) then
FExistsAlready := True; //如果已经建立的话,就设它为TRUE;
FMapPointer := MapViewOfFile(FMapHandle, FILE_MAP_ALL_ACCESS, 0, 0, IE_MAPSIZE);
end; FIsMapOpen := True;
end;1.通过权限控制,可以跨服务、应用程序
2.在你的应用中,Map名称建议Global\起始,具体说明请见MSDN