Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Непонятка с Memory Mapped Files  [new]
dundin
Member

Откуда:
Сообщений: 41
Добрый день, Всем!
Подскажите, где собака порылась.
Задача: одно приложение записывает в Memory Mapped File произвольную строку.
Другое приложение - считывает.
Для отображения файла в память использую файл подкачки.
Среда - Delphi 7;


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

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;


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


В другом приложении пытаемся считать:
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". Но там - звенящая пустота)
Что я делаю не так?

Зенкс ин эдванс.
4 мар 19, 06:54    [21824002]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
loww
Member

Откуда:
Сообщений: 4
Непонятно нафига ты WriteFile используешь, получил адрес памяти от MapViewOfFile и пиши по данному адресу.
4 мар 19, 07:11    [21824004]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
dundin
Member

Откуда:
Сообщений: 41
loww
Непонятно нафига ты WriteFile используешь, получил адрес памяти от MapViewOfFile и пиши по данному адресу.

Спасибо за ответ.
Прошу уточнений)
Насколько я понял - алгоритм работы такой:
1. Получили хендл того, что будем отображать
2. Записали в этот объект что то.
3. Отобразили.

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

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

Можно пример кода?
4 мар 19, 07:55    [21824020]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
dundin
Member

Откуда:
Сообщений: 41
А...
ну вроде разобрался
http://delphikingdom.com/asp/viewitem.asp?catalogid=513&mode=print
4 мар 19, 08:21    [21824025]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
Arioch
Member

Откуда:
Сообщений: 10598
dundin
procedure refreshData(str: string);


лучше бы AnsiString

иначе потом кто-то обновит Delphi - и подорвётся
4 мар 19, 16:05    [21824588]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10771
Arioch
лучше бы AnsiString
Тогда, наоборот, лучше WideString
4 мар 19, 17:29    [21824675]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
Arioch
Member

Откуда:
Сообщений: 10598
_Vasilisk_
Arioch
лучше бы AnsiString
Тогда, наоборот, лучше WideString


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

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

но если на одном компе могут работать одновременно программы с разными версиями "MMF-библиотеки", то ой
4 мар 19, 19:51    [21824795]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
Vizit0r
Member

Откуда:
Сообщений: 589
так он же и делает обе программы - и "писателя" и "читателя". Вряд ли он соберет одну на старых Дельфах, а вторую на новых.
4 мар 19, 21:10    [21824831]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
Василий 2
Member

Откуда:
Сообщений: 433
AnsiString в 2019, что за моветон?
5 мар 19, 13:44    [21825352]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
Gator
Member

Откуда: Москва
Сообщений: 14084
Василий 2,

А может у него старинная дельфя?
5 мар 19, 15:04    [21825452]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Василий 2,

ну давай еще UTF32String использовать чисто для понтов, "моя строки в 4 раза длиннее твоей!"
5 мар 19, 16:17    [21825528]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Vizit0r
так он же и делает обе программы - и "писателя" и "читателя". Вряд ли он соберет одну на старых Дельфах, а вторую на новых.


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

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

а запускать наунад из любой папки
5 мар 19, 16:17    [21825531]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10771
Vizit0r
так он же и делает обе программы - и "писателя" и "читателя". Вряд ли он соберет одну на старых Дельфах, а вторую на новых.
Потом пересобираться может только читатель или писатель. Я, в свое время, на эти грабли наступил
5 мар 19, 19:00    [21825689]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
Василий 2
Member

Откуда:
Сообщений: 433
Arioch
Василий 2,

ну давай еще UTF32String использовать чисто для понтов, "моя строки в 4 раза длиннее твоей!"

Ну если для тебя есть только Ansi, Wide и utf32, то окей, продолжай существовать в позапрошлом веке. Удачи, когда вдруг понадобится передать, к примеру, £
5 мар 19, 19:13    [21825699]     Ответить | Цитировать Сообщить модератору
 Re: Непонятка с Memory Mapped Files  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Василий 2
для тебя есть только Ansi, Wide и utf32
....
понадобится передать, к примеру, £


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

Вот так вот проснёшься....
5 мар 19, 19:54    [21825732]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить