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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2010, 05:50   #1
PM_PM
Новичок
Джуниор
 
Регистрация: 19.11.2010
Сообщений: 1
По умолчанию Задача на COM, MMF, etc.

Я занялся этой задачей,
Скан условия:
http://public.fotki.com/temptemptemp/task/exercise.html


но есть вопросы.

Я не знаю как сделать так, чтобы все клиенты COM-объекта пользовались
именно одним экземпляром COM-объекта. Именно один экземпляр нужен,
видимо, для того, чтобы всем интересующимся выдать одну и ту же
строку.
inproc dll, я так понимаю, не подходит, т.к. тогда у каждого
клиента будет свой эксемпляр COM-объекта и эти разные экземпляры не
смогут обладать общим знанием единстевенной строки.
Похоже нужен локальный сервер типа EXE (может и dll можно сделать локальным. я не имею в виду суррогатный процесс).
Пока я нащупал одно место про функцию CoRegisterClassObject(), котороя по-моему имеет
отношение к делу:
"REGCLS_SINGLEUSE informs SCM to launch a new instance of the server for each client request.
REGCLS_MULTIPLE_SEPARATE specifies that any number of clients can share a single server
until the class object is revoked from the class table by the EXE
using CoRevokeClassObject()."

Но даже если все клиенты будут пользоваться COM сервером из одного
процесса, то получив указатель фабрики класса и вызвав CreateInstance
они получат разные экзепляры объекта. Или надо чтобы фабрика класса создавала
только один экземпляр кокласса (навроде синглтона)?

Еще не понятно по заданию что такое сервер шеред мемори. Что имеется
в виду под :"...начинает роль сервера шаред мемори".
Что имелось в виду здесь :"После установления успешного соединения..."
Может под соединением понимается отображение и сервером и клиентом
одного и того же MMF?

Видимо я не все правильно понимаю, но пока я интерпретирую задачу так
(поправь если что пожалуйста)
1. Создается COM сервер (да такой, что представлен одним единственным
экземпляром, который генерирует случайную строку и отвечает на вопросы
клиентов - выдает им эту строку.)
2. Судя по частым упоминаниям шеред мемори межпроцессное
взаимодействие (передача файлов) производятся через механизм memory
mapped file. Кто-то должен создать MMF - пусть это будет так
называемый сервер шеред мемори. Имя(строку) он получил у COM-сервера.
3. Приложения клиент также отображает MMF с этим именем на свое
адресное простанство. И записывает часть файла (файл может быть
огромным) по этим адресам. Дает, например Event для сервера и он
узнает, что в его адресном простарнстве, куда спроецирован MMF уже
готовая часть файла и что-то делает с ним и дает Event клиенту, что
готов к приему следующей порции. Надо еще как-то передавать размер
файла (сокеты наверное)

Это основное предположение. Проблема еще то, что клиентов одновременно
может быть много и каждый клиент может одновременно много файлов
отправлять. Наверное и MMF должно быть наример N штук. И у сервера N
потоков. И у клиентов несколько, чтобы реализовать пункт 7 (Реализовать возможность
одновременной передачи нескольких файлов от одного клиента и от нескольких клиентов)

Тогда может COM-сервер должен снабжать не одной а множеством из N строк?

У рихтера описано два варианта использования MMF
1. Проецируется файл на диске на адресное простанство процесса.
Тогда файл между процессами можно скопировать так:
Клиент создает проекцию файла на диске. Сервер проецирует эту
проекцию на свое адресное пространство - и все, файл скопирован! Но
тогда мы не того назвали сервером шеред мемори
2. Memory-Mapped Files Backed by the Paging File

Если я непонятно изложил разницу между этими двумя подходами MMF
то для удобства скопирую абзац из рихтера
This method is almost identical to the method for creating a memory-mapped disk file except
that it's even easier. For one thing, there is no need to call CreateFile since you will not be
creating or opening a dedicated file. Instead, you simply call CreateFileMapping as you would
normally and pass INVALID_HANDLE_VALUE as the hFile parameter. This tells the system that you
are not creating a file-mapping object whose physical storage resides in a file on the disk;
instead, you want the system to commit physical storage from the system's paging file.
Склонен второй подход использовать, ибо копировать надо по частям из
гиганстского размера файлов.

Вот подходящая реализация последнего подхода
http://www.codeguru.com/cpp/misc/misc/article.php/c415/

Правильный ли подход? Как все-таки реализовать данный COM-сервер. Какие есть мнения?
PM_PM вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на С++ Перфаратар Помощь студентам 1 21.10.2010 23:09
mmf isus Фриланс 4 05.10.2009 20:17
1 задача Siroga35 Помощь студентам 4 11.03.2009 20:22