Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проецирование структуры в память 
:(
    Опции темы
freezeman
Дата 7.5.2012, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Всем привет!

Подскажите, пожалуйста!
Мне нужно сделать общей структуру для 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". */

PM MAIL   Вверх
freezeman
Дата 7.5.2012, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



Если в memcpy вместо размера файла (он достаточно большой ~100 мб) укажу, например, 2048, то все копируется нормально!!! Почему так происходит, мне казалось, что должно копироваться только 2048 байт...
PM MAIL   Вверх
feodorv
Дата 7.5.2012, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(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.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
freezeman
Дата 8.5.2012, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 21.1.2011

Репутация: нет
Всего: нет



В коде небольшие неточности были, но я решил отказаться от этого метода... получилось все другим способом.
Спасибо за ответ!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.