powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Непонятка с Memory Mapped Files
15 сообщений из 15, страница 1 из 1
Непонятка с Memory Mapped Files
    #39781680
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, Всем!
Подскажите, где собака порылась.
Задача: одно приложение записывает в Memory Mapped File произвольную строку.
Другое приложение - считывает.
Для отображения файла в память использую файл подкачки.
Среда - Delphi 7;


Процедура, которая записывает:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
var 
  gHndFile, gHndMapedFile : HWND;
  gPntMapFile : Pointer;

procedure refreshData(str: string);
var
  fileName : string;
  f : TextFile;
  byteWrt : Cardinal;
  pStr : PAnsiChar;
begin
  fileName := 'myfile';
  gHndMapedFile:=CreateFileMapping(INVALID_HANDLE_VALUE,                
                                nil,                 
                                PAGE_READWRITE,       
                                0,                    
                                Length(str) * SizeOf(Char), 
                                PChar(fileName));        


  if gHndMapedFile = INVALID_HANDLE_VALUE then
  begin
    ShowMessage('Ошибка ' + SysErrorMessage(GetLastError));
    CloseHandle(gHndFile);
    Exit;
  end;

  pStr := PChar(str);
  WriteFile(gHndMapedFile, pStr, Length(str)*SizeOf(Char), byteWrt, nil);

  gPntMapFile:=MapViewOfFile(gHndMapedFile,           
                          FILE_MAP_ALL_ACCESS,  
                          0,0,
                          Length(str) * SizeOf(Char));
  if gPntMapFile=nil then
  begin
    ShowMessage('Ошибка '+SysErrorMessage(GetLastError));
    CloseHandle(gHndMapedFile);
    CloseHandle(gHndFile);
    Exit;
  end;
end;



Записываем произвольную строку:
Код: sql
1.
refreshData('data');



В другом приложении пытаемся считать:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
procedure TfrmClient.btnReadClick(Sender: TObject);
var
  hMapedFile:HWND;
  pMapFile:Pointer;
const
  bufSize=100;// размер буффера
begin
  hMapedFile:=OpenFileMapping(FILE_MAP_ALL_ACCESS, 
                              False, 
                              PChar('myfile'));

  if hMapedFile=INVALID_HANDLE_VALUE then
  begin
    ShowMessage('Ошибка '+SysErrorMessage(GetLastError));
    Exit;
  end;

  pMapFile:=MapViewOfFile(hMapedFile,
                          FILE_MAP_ALL_ACCESS,
                          0,0,
                          bufSize*SizeOf(Char));

  if pMapFile=nil then
  begin
    ShowMessage('Ошибка '+SysErrorMessage(GetLastError));
    CloseHandle(hMapedFile);
    Exit;
  end;

  Memo1.Text:=PChar(pMapFile);
  UnmapViewOfFile(pMapFile);
  CloseHandle(hMapedFile);
end;



Если не записывать - то в программе считывателе возникает ошибка (что логично, ибо этого файла в памяти нет).
Т.е. программа-считыватель видит файл. Но когда его читает - видит пустоту.
Ожидаю что в memo1 появится слово "data". Но там - звенящая пустота)
Что я делаю не так?

Зенкс ин эдванс.
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39781682
loww
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонятно нафига ты WriteFile используешь, получил адрес памяти от MapViewOfFile и пиши по данному адресу.
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39781694
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lowwНепонятно нафига ты WriteFile используешь, получил адрес памяти от MapViewOfFile и пиши по данному адресу.
Спасибо за ответ.
Прошу уточнений)
Насколько я понял - алгоритм работы такой:
1. Получили хендл того, что будем отображать
2. Записали в этот объект что то.
3. Отобразили.

В другом процессе - прочитали.

Вы говорите, что нужно:
1. Отобразить.
2. Записать.

Можно пример кода?
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39781697
dundin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782083
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dundin
Код: pascal
1.
procedure refreshData(str: string);



лучше бы AnsiString

иначе потом кто-то обновит Delphi - и подорвётся
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782150
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochлучше бы AnsiStringТогда, наоборот, лучше WideString
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782223
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Ariochлучше бы AnsiStringТогда, наоборот, лучше WideString

сломает совместимость с сегодняшними программами

хотя, конечно, MMF - не постоянный файл на диске, может быть и наплевать

но если на одном компе могут работать одновременно программы с разными версиями "MMF-библиотеки", то ой
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782245
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так он же и делает обе программы - и "писателя" и "читателя". Вряд ли он соберет одну на старых Дельфах, а вторую на новых.
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782485
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AnsiString в 2019, что за моветон?
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782538
Фотография Gator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2,

А может у него старинная дельфя?
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782579
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2,

ну давай еще UTF32String использовать чисто для понтов, "моя строки в 4 раза длиннее твоей!"
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782581
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rтак он же и делает обе программы - и "писателя" и "читателя". Вряд ли он соберет одну на старых Дельфах, а вторую на новых.

он-то вряд ли, а вот пользюки - они такие пользюки бывают...

будут "на всякий случай, а то страшно" держать на компе несколько версий "а вдруг в новой всё поломали"

а запускать наунад из любой папки
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782678
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vizit0rтак он же и делает обе программы - и "писателя" и "читателя". Вряд ли он соберет одну на старых Дельфах, а вторую на новых.Потом пересобираться может только читатель или писатель. Я, в свое время, на эти грабли наступил
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782685
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochВасилий 2,

ну давай еще UTF32String использовать чисто для понтов, "моя строки в 4 раза длиннее твоей!"
Ну если для тебя есть только Ansi, Wide и utf32, то окей, продолжай существовать в позапрошлом веке. Удачи, когда вдруг понадобится передать, к примеру, £
...
Рейтинг: 0 / 0
Непонятка с Memory Mapped Files
    #39782703
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2для тебя есть только Ansi, Wide и utf32
....
понадобится передать, к примеру, £

И давно символ фунта убрали из UTF-16 ?

Вот так вот проснёшься....
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Непонятка с Memory Mapped Files
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]