Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.70/33: Рейтинг темы: голосов - 33, средняя оценка - 4.70
besserebrenik
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 10
1

функция winApi CreateFileMapping()

09.02.2010, 21:31. Просмотров 5936. Ответов 4
Метки нет (Все метки)

Сейчас столкнулся с проблемой. Полное непонимание FileMapping
Есть следующий код. Он должен выводить в мемо строку из swap-файла..
Не работает

Подскажите, в чем проблема.

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
procedure TForm1.Button1Click(Sender: TObject);
var
  ffile: THandle;
  ffileMapObj: THandle;
  lpBaseAdd: PChar;
  str: string;
begin
  //ffile := CreateFile('C:\ffile.txt', GENERIC_ALL, FILE_SHARE_WRITE, nil, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0);
  ffile := CreateFile('ffile.txt', GENERIC_ALL, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if (ffile = INVALID_HANDLE_VALUE) then
    ShowMessage('C:\pzdc!');
  Edit1.Text := IntToStr(ffile);
  Edit2.Text := IntToStr(DWORD(-1));     // посмотрел код ошибки
  ffileMapObj := CreateFileMapping(
            ffile, // Ссылка на файл
            Nil,   // указатель на запись типа TSecurityAttributes
            PAGE_READWRITE, // способ совместного использования создаваемого объекта
            0,     // старший разряд 64-битного значения размера выделяемого объема памяти для совместного доступа
            1,    // размер файла подкачки
            'MySharedValue' // имя объекта файлового отображения
            );
  if (ffileMapObj <> 0) then
    ShowMessage('Операция создания Swap-файла удалась');
  lpBaseAdd := MapViewOfFile(ffileMapObj, FILE_MAP_WRITE, 0, 0, 0);
  if (lpBaseAdd = nil) then
    ShowMessage('Не могу подключить FileMapping!');
  CopyMemory(@str, lpBaseAdd, 12);
  Memo1.Lines.Add(str);           // по идее тут я в мемо должен получить кусок своего текстового файла
  // этого не происходит
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2010, 21:31
Ответы с готовыми решениями:

Функция winApi WriteFileEx()
Сейчас столкнулся с асинхронными файловыми операциями (I/O). Нашел в сети...

Как увидеть то, что вернула функция WinApi?
например вот такая процедура procedure TForm1.btnSysDirClick(Sender: TObject);...

Работа с COM портами WinAPI, конкретно функция ClearCommError
Всем доброго времени суток, я вообще не программист, программирую от случая к...

Какая функция winapi возвращает результатом значение по адресу памяти (указатель)?
Какая функция winapi возвращает результатом значение по адресу памяти...

Обмен данными между процессами (с использованием CreateFileMapping, MapViewOfFile, UnMapViewOfFile)
Помогите кто может и чем может, пожалуйста. Нужно разработать приложение, с...

4
Mawrat
12827 / 5735 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
10.02.2010, 13:45 2
Неверно передан параметр в CopyMemory():
Delphi
1
  CopyMemory(@Str, lbBaseAdd, 12);
заменить на:
Delphi
1
  CopyMemory(Pointer(Str), lbBaseAdd, 12);
Str - физически, это переменная, содержащая указатель на строку. Выражение @Str вернёт адрес переменной Str, а не строки! Нам же нужен адрес самой строки. Этот адрес записан в самой переменной Str. Поэтому надо использовать: Pointer(Str);
0
besserebrenik
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 10
10.02.2010, 17:43  [ТС] 3
Спасибо, Mawrat. Сделал как вы и сказали. Но теперь выскакивает EAccessViolation.
Я закинул в файл строку из 12 символов. Я легко ее получаю с помощью вот такого действия ( нашел здесь)

Delphi
1
lbVariable.Caption:=PChar(lpBaseAddress);
Но по условию лабы нужно CopyMemory()
0
Mawrat
12827 / 5735 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
10.02.2010, 17:56 4
Для строки предварительно ещё память надо выделить. Т. е. так:
Delphi
1
2
SetLength(Str, 12);
CopyMemory(Pointer(Str), lbBaseAdd, 12);
1
besserebrenik
0 / 0 / 0
Регистрация: 26.11.2009
Сообщений: 10
10.02.2010, 18:04  [ТС] 5
Ааа! Вы меня опередили!
0
10.02.2010, 18:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2010, 18:04

WinAPI
Как мне программно совершить эти действия,которые показаны на видео? ...

winapi
РЕБЯТА,ПОМОГИТЕ пожалуйста со следующим: в программе нужно прописать коды...

WinAPI
Подскажите плиз книгу какуюнить по WinAPI для полного,полного чайника:)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru