Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2011, 13:38   #1
castanic
 
Регистрация: 12.10.2011
Сообщений: 3
По умолчанию Как работать с file mapping?

Вот что я делаю (C++ Builder):
Код:

HANDLE hf,hfm;
DWORD dwBytesWritten=4096;
LPCTSTR lpa;
if(OpenDialog1->Execute())
{
if((hf=CreateFile (OpenDialog1->FileName.c_str(), 
                       GENERIC_READ|GENERIC_WRITE, 
                      FILE_SHARE_READ, NULL,CREATE_ALWAYS, 
                      FILE_ATTRIBUTE_NORMAL,
                      NULL))==INVALID_HANDLE_VALUE) 
  ShowMessage("Error!");
else
{
WriteFile(hf, Memo1->Lines->Text.c_str(), strlen(Memo1->Lines->Text.c_str()),&dwBytesWritten, NULL);
hfm = CreateFileMapping (hf, NULL, PAGE_READWRITE, 0, 0,OpenDialog1->FileName.c_str());
CloseHandle(hf);
lpa=(LPCTSTR)MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, dwBytesWritten);
ShowMessage(lpa);
CloseHandle(hfm);
}
}
В ShowMessage пусто.
Скорее всего я неправильно обрабатываю то, что возвращает MapViewOfFile().

Последний раз редактировалось rpy3uH; 13.10.2011 в 12:58.
castanic вне форума Ответить с цитированием
Старый 12.10.2011, 14:44   #2
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

проблема в CloseHandle(hf)
хендл файла надо закрывать только после закрытия хендла файлового мэпинга
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 12.10.2011, 14:59   #3
castanic
 
Регистрация: 12.10.2011
Сообщений: 3
По умолчанию

Цитата:
Сообщение от haruhi Посмотреть сообщение
проблема в CloseHandle(hf)
хендл файла надо закрывать только после закрытия хендла файлового мэпинга
Все равно ShowMessage пустой при том, что файл, проекция которого создаеться - нет.
castanic вне форума Ответить с цитированием
Старый 12.10.2011, 17:23   #4
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

попробуйте после записи в файл закрыть его, а потом снова открыть для мэпинга
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 12.10.2011, 19:10   #5
castanic
 
Регистрация: 12.10.2011
Сообщений: 3
По умолчанию

Оказалось очень просто:
Код:
HANDLE hf,hfm;
DWORD dwFileSize;
LPCTSTR lpa;
if(OpenDialog1->Execute())
{
if((hf=CreateFile (OpenDialog1->FileName.c_str(),
                   dwDesiredAccess,
                   dwShareMode,
                   NULL,
                   dwCreationDisposition,
                   dwFlagsAndAttributes,
                   NULL))==INVALID_HANDLE_VALUE)
        ShowMessage("Error!");
else
{
WriteFile(hf, Memo1->Lines->Text.c_str(), strlen(Memo1->Lines->Text.c_str()),&dwFileSize, NULL);

hfm = CreateFileMapping (hf, NULL, PAGE_READWRITE, 0, 0,0);
CloseHandle(hf);
lpa=(LPCSTR)MapViewOfFile(hfm, FILE_MAP_READ, 0, 0, dwFileSize);
AnsiString s;
for (int i=0;i<dwFileSize;i++)
s=s+lpa[i];
ShowMessage(s);
CloseHandle(hfm);
}
}
Спасибо за помощь, haruhi.
castanic вне форума Ответить с цитированием
Старый 12.11.2011, 04:35   #6
riako
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 1
По умолчанию

Добрый день и спасибо за рабочий пример выше. Однако, этот пример позволяет лишь создать файл, и заполнив его вручную, войти в режим отображения файла в памяти. Подскажите пожалуйста, как сделать чтение существующего файла? Простое изменение режима открытия на что-то вроде
Код:
hf=CreateFile (OpenDialog1->FileName.c_str(),
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
и удаление строчки WriteFile в лучшем случае открывает существующий файл как пустой и не позволяет по указателю lpa осуществить доступ к данным. Есть ли способ?
_____
Оказалось, вместо CreateFile нужно использовать FileOpen
Код:
hf = (HANDLE)FileOpen(OpenDialog1->FileName.c_str(), fmOpenReadWrite+fmShareDenyNone);

Последний раз редактировалось riako; 12.11.2011 в 04:56.
riako вне форума Ответить с цитированием
Старый 12.11.2011, 11:41   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

FileOpen - это тот же CreateFile, только некоторые параметры уже заполнены
p51x вне форума Ответить с цитированием
Старый 12.11.2011, 12:39   #8
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

Цитата:
hf = (HANDLE)FileOpen(OpenDialog1->FileName.c_str(), fmOpenReadWrite+fmShareDenyNone);
эквивалент CreateFile должен быть таким
Код:
hf=CreateFile (OpenDialog1->FileName.c_str(),
     GENERIC_ALL,
     NULL,
     NULL,
     OPEN_EXISTING,
     NULL,
     NULL);
попробуйте
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чём разница между unit, header file, cpp file? TwiX Общие вопросы C/C++ 6 29.04.2012 19:49
File Mapping Gambler Win Api 1 13.08.2010 11:40
Свой PORT MAPPING (NAT) exploys Работа с сетью в Delphi 0 05.06.2010 01:24
Error 1 fatal error C1083: Cannot open include file: 'iostream.h': No such file or directory s20 Общие вопросы C/C++ 2 26.09.2009 23:28
как вставить swf file в delphi Altera Компоненты Delphi 4 18.02.2008 20:12