|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
19.11.2010, 05:50 | #1 |
Новичок
Джуниор
Регистрация: 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-сервер. Какие есть мнения? |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Задача на С++ | Перфаратар | Помощь студентам | 1 | 21.10.2010 23:09 |
mmf | isus | Фриланс | 4 | 05.10.2009 20:17 |
1 задача | Siroga35 | Помощь студентам | 4 | 11.03.2009 20:22 |