Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Непонятка с Memory Mapped Files / 15 сообщений из 15, страница 1 из 1
04.03.2019, 06:54
    #39781680
dundin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с Memory Mapped Files
Добрый день, Всем!
Подскажите, где собака порылась.
Задача: одно приложение записывает в 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
04.03.2019, 07:11
    #39781682
loww
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с Memory Mapped Files
Непонятно нафига ты WriteFile используешь, получил адрес памяти от MapViewOfFile и пиши по данному адресу.
...
Рейтинг: 0 / 0
04.03.2019, 07:55
    #39781694
dundin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Непонятка с Memory Mapped Files
lowwНепонятно нафига ты WriteFile используешь, получил адрес памяти от MapViewOfFile и пиши по данному адресу.
Спасибо за ответ.
Прошу уточнений)
Насколько я понял - алгоритм работы такой:
1. Получили хендл того, что будем отображать
2. Записали в этот объект что то.
3. Отобразили.

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

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

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



лучше бы AnsiString

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

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

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

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

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

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

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

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

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

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

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

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


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