Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Проецирование структуры в память


Автор: freezeman 7.5.2012, 15:29
Всем привет!

Подскажите, пожалуйста!
Мне нужно сделать общей структуру для 2-х программ. Структура содержит содержимое файла и дату последнего доступа к нему.
Я создал проекцию в памяти, затем заношу туда структуру... как это сделать корректно?

Код:
Код

...
struct FileInCache
{
    FILETIME FileTime; // дата последнего доступа к файлу
    char *buffer; // содержимое файла
};
...
char *buffer1 = ... // содержимое файла
FileInCache *fileCache;
FileInCache fileCache2;

fileCache = (struct FileInCache *)MapViewOfFile(
          hFileM,
          FILE_MAP_ALL_ACCESS,
          0,
          0,
          size);
CopyMemory(fileCache2.buffer, buffer1, size); // Ошибка Run-Time Check Failure #3 - The variable 'fileCache2' is being used without being initialized.
memcpy(fileCache, &fileCache2, size); /* Ошибка Необработанное исключение в "0x1027c9c7 (msvcr100d.dll)" в "Alghoritm.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00133000". */

Автор: freezeman 7.5.2012, 17:13
Если в memcpy вместо размера файла (он достаточно большой ~100 мб) укажу, например, 2048, то все копируется нормально!!! Почему так происходит, мне казалось, что должно копироваться только 2048 байт...

Автор: feodorv 7.5.2012, 21:55
Цитата(freezeman @  7.5.2012,  16:29 Найти цитируемый пост)
struct FileInCache
{
    FILETIME FileTime; // дата последнего доступа к файлу
    char *buffer; // содержимое файла
};

А куда, как планируется, должен указывать FileInCache.buffer? В какую область памяти?


Цитата(freezeman @  7.5.2012,  16:29 Найти цитируемый пост)
Мне нужно сделать общей структуру для 2-х программ.

Ну хорошо (хотя 100М переданной общей памяти - не очень). Что тогда это значит:
Цитата(freezeman @  7.5.2012,  16:29 Найти цитируемый пост)
fileCache = (struct FileInCache *)MapViewOfFile(...

Вы думаете, что если в одной программе FileInCache.buffer настроен правильно (указывает в нужную область памяти этого процесса), то и в другой программе этот указатель будет валидным? (Намёк: MapViewOfFile в разных программах может вернуть разный адрес даже для одного и того же объекта проекция файла, и в другом процессе то же значение для buffer'а будет указывать не туда).


Цитата(freezeman @  7.5.2012,  16:29 Найти цитируемый пост)
// Ошибка Run-Time Check Failure #3 - The variable 'fileCache2' is being used without being initialized.

Ну так надо же fileCache2.buffer проинициализировать:
Код

if( (fileCache2.buffer = HeapAlloc( ...size)) == NULL ) ...;

Если же всё таки планируется именно 
Цитата(freezeman @  7.5.2012,  16:29 Найти цитируемый пост)
Структура содержит содержимое файла и дату последнего доступа к нему

то структуру стоит определить как 
Код

struct FileInCache
{
    FILETIME FileTime; // дата последнего доступа к файлу
    char buffer[1]; // содержимое файла
};

В таком случае buffer всегда будет указывать на память, следующую сразу за FileTime (чтобы там MapViewOfFile) не вернула.

Но, пожалуйста, разберитесь с переменной size: что она означает? Длину файла или размер структуры вместе с содержимым файла?
Цитата(freezeman @  7.5.2012,  16:29 Найти цитируемый пост)
CopyMemory(fileCache2.buffer, buffer1, size); 
memcpy(fileCache, &fileCache2, size); 

Даже если здесь всё проинициализировано правильно, то всё равно есть противоречие с size.

Автор: freezeman 8.5.2012, 01:24
В коде небольшие неточности были, но я решил отказаться от этого метода... получилось все другим способом.
Спасибо за ответ!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)