У меня есть приложение Delphi 6, а также DLL, которые совместно используют файл отображения памяти для передачи данных между ними. Я знаю, что ошибки программных страниц являются обычным побочным эффектом файлов, отображаемых в память, но я получаю намного больше, чем мне кажется (высокие значения PF Delta в диспетчере задач около 2000 в секунду). Поэтому я публикую части своего кода, которые создают файл с отображением памяти, записываю в него и читаю из него, чтобы увидеть, может ли кто-нибудь увидеть какой-то недостаток в моем подходе. Вот выдержки из кода ниже. Обратите внимание, я использую желаемый размер файла 1 МБ:
// Uses pagefile.sys
procedure initFile(
theFilename: string;
theDesiredFilesize: integer;
out theViewHandle: THandle;
out theBaseAddressPtr: Pointer);
var
MaximumSizeLow, MaximumSizeHigh: Cardinal;
begin
I64ToCardinals(theDesiredFilesize, MaximumSizeLow, MaximumSizeHigh);
theViewHandle :=
CreateFileMapping(
INVALID_HANDLE_VALUE,
nil,
PAGE_READWRITE or SEC_COMMIT,
MaximumSizeHigh,
MaximumSizeLow,
PChar(theFilename));
if theViewHandle = 0 then
RaiseLastOSError;
theBaseAddressPtr := MapViewOfFile (theViewHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
end;
procedure TShareMem.doSaveBuffer(const theSourceBufPtr: Pointer; numBytes: integer);
var
newSize: Int64;
begin
if not Assigned(theSourceBufPtr) then
raise Exception.Create('(doSaveBuffer) The source buffer pointer is unassigned.');
newSize := numBytes;
Move(theSourceBufPtr^, FDataBufferPtr^, newSize);
// Increment the write count.
Inc(FDataBufferHeader.writeCount);
// Update the variable that lets others know the actual size of the
// object/data we just stored.
FDataBufferHeader.sizeInUse := numBytes;
// Update the header file.
updateHeaderFile;
end;
procedure TShareMem.loadStream(theDestStream: TMemoryStream);
var
theSize: Int64;
begin
if not Assigned(theDestStream) then
raise Exception.Create('(loadStream) The destination stream is unassigned.');
updateHeader;
// Rewind the destination stream.
theDestStream.Position := 0;
theSize := FDataBufferHeader.sizeInUse;
theDestStream.Size := theSize;
// Read data from the memory mapped data buffer into the stream.
// theDestStream.WriteBuffer(FDataBufferPtr^, FDataBufferHeader.size);
Move(FDataBufferPtr^, theDestStream.Memory^, theSize);
end;