File Mapping
От: Yuri Россия http://spbdetails.ru
Дата: 31.01.02 10:54
Оценка:
Привет всем!
Создаю отображаемый файл:
HANDLE hMapFile = ::CreateFileMapping((HANDLE) -1, NULL, PAGE_READWRITE, 0, 4100, _T("My_Map_File"));
Затем пишу в него:

DWORD nbw = 0;

struct TCopyData {
TCHAR chLocName[1000];
TCHAR chURL[1000];
} CopyData;

//...

::WriteFile(hMapFile, &CopyData, 2000, &nbw, NULL);

nbw == 0 всегда, т.е. ничего не записано!
Take it easy.
Re: File Mapping
От: Sasparella США  
Дата: 31.01.02 11:06
Оценка:
Здравствуйте Yuri, Вы писали:

Y>::WriteFile(hMapFile, &CopyData, 2000, &nbw, NULL);


А какая ошибка при этом возвращается?

Попоробуйте поюзать MapViewOfFile и писать в память.

Саша.
Re[2]: File Mapping
От: Yuri Россия http://spbdetails.ru
Дата: 31.01.02 11:14
Оценка:
Здравствуйте Sasparella, Вы писали:

S>А какая ошибка при этом возвращается?


Code: 5
Description: Access is denied.
Name: ERROR_ACCESS_DENIED
Take it easy.
Re: File Mapping
От: Владимир Россия  
Дата: 31.01.02 11:49
Оценка: 15 (3)
Здравствуйте Yuri, Вы писали:

Y>Создаю отображаемый файл:

Y>HANDLE hMapFile = ::CreateFileMapping((HANDLE) -1, NULL, PAGE_READWRITE, 0, 4100, _T("My_Map_File"));
Y>Затем пишу в него:
Y> //...
Y>::WriteFile(hMapFile, &CopyData, 2000, &nbw, NULL);
Y>nbw == 0 всегда, т.е. ничего не записано!

Ессно, в файл ничего не запишется! CreateFileMapping возвращаем не дескриптор файла, а
хэндл объекта ядра — file mapping object. Для того, чтобы произвести запись в файл,
связанный с этим объектом, надо вызвать MapViewOfFileEx(hMapFile, ....).

Вот пример (из MSDN):

HANDLE hMapFile;

hMapFile = CreateFileMapping(hFile, // Current file handle.
NULL, // Default security.
PAGE_READWRITE, // Read/write permission.
0, // Max. object size.
0, // Size of hFile.
"MyFileMappingObject"); // Name of mapping object.


LPVOID lpMapAddress;
lpMapAddress = MapViewOfFile(hMapFile, // Handle to mapping object.
FILE_MAP_ALL_ACCESS, // Read/write permission
0, // Max. object size.
0, // Size of hFile.
0); // Map entire file.

lpMapAddress — указатель на память, куда отображен файл, по сути это массив DWORD'ов
А далее просто пишем в память:

DWORD dwValue;
*((LPDWORD) lpMapAddress) = dwValue

или

LPDWORD lpFile;
lpFile = (LPDWORD) lpMapAddress;
lpFile[2] = 123;
OK
Re[2]: Thanks
От: Yuri Россия http://spbdetails.ru
Дата: 31.01.02 11:55
Оценка:
Take it easy.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.