Объясните мне, пожалуйста,
Как сделать СОМ — объект, такой чтоб он существовал в единственном
экземпляре, т.е. что бы CoCreateInstance возвращала указатель на один и тот же
объект (при вызове из разных процессов)
Желательно без использования MFC или ATL
Здравствуйте alexei_, Вы писали:
A>Объясните мне, пожалуйста, A>Как сделать СОМ — объект, такой чтоб он существовал в единственном A>экземпляре, т.е. что бы CoCreateInstance возвращала указатель на один и тот же A>объект (при вызове из разных процессов) A>Желательно без использования MFC или ATL
A>Алексей
Можно посмотреть как реализована ATL::CComClassFactorySingleton, ATL::CComObjectGlobal etc. и переписать без ATL.
Здравствуйте MORBiD, Вы писали:
MORBD>Здравствуйте alexei_, Вы писали:
A>>Объясните мне, пожалуйста, A>>Как сделать СОМ — объект, такой чтоб он существовал в единственном A>>экземпляре, т.е. что бы CoCreateInstance возвращала указатель на один и тот же A>>объект (при вызове из разных процессов) A>>Желательно без использования MFC или ATL
A>>Алексей
MORBD>Можно посмотреть как реализована ATL::CComClassFactorySingleton, ATL::CComObjectGlobal etc. и переписать без ATL.
Да, но насколько я понял ...Singleton работает только для ехе-серверов,
Или я ошибаюсь ?
Здравствуйте Alexei_, Вы писали:
A>Здравствуйте MORBiD, Вы писали:
MORBD>>Здравствуйте alexei_, Вы писали:
A>>>Объясните мне, пожалуйста, A>>>Как сделать СОМ — объект, такой чтоб он существовал в единственном A>>>экземпляре, т.е. что бы CoCreateInstance возвращала указатель на один и тот же A>>>объект (при вызове из разных процессов) A>>>Желательно без использования MFC или ATL
A>>>Алексей
MORBD>>Можно посмотреть как реализована ATL::CComClassFactorySingleton, ATL::CComObjectGlobal etc. и переписать без ATL.
A>Да, но насколько я понял ...Singleton работает только для ехе-серверов, A>Или я ошибаюсь ?
У тебя DLL, значит есть экспортная функция функция GetClassObject.
Каждый раз CoCreateInstance вызывает GetClassObject в DLL, если создаеться объект из твоей DLL.
Сделай так, чтобы GetClassObject возвращала указатель на единажды созданный объект. и сё.
Эта функция возвращает объект класса который априори синглетон, но (!) это не то о чем ты думаешь.
Объектами класса никто не пользуется напрямую! Обычно COM-сервер размещенный в DLL через DllGetClassObject возвращает указатель на единственный объект — Фабрику Классов. Этот объект реализует стандартный интерфейс IClassFactory. Именно его исползоует CoCreateInstace[Ex] для создания экземпляра COM-объекта. Так что нужно изменять не DllGetClassObject, а реализацию объекта — Фабрики Классов. Если она написана руками, то вместо создания каждый раз нового объекта нужно просто возвращать указатель на единый экземпляр.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Все выше написаное правильно, но только если объекты создаются из одного процесса.
При вызове из РАЗНЫХ процессов будут создаваться РАЗНЫЕ копии dll, поэтому надо проверять нет ли предыдущей копии dll в памяти. Это удобно делать через расшаренную память, и в ней же тогда хранить счетчик ссылок на объект.
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте alexei_, Вы писали:
DG>Все выше написаное правильно, но только если объекты создаются из одного процесса. DG>При вызове из РАЗНЫХ процессов будут создаваться РАЗНЫЕ копии dll, поэтому надо проверять нет ли предыдущей копии dll в памяти. Это удобно делать через расшаренную память, и в ней же тогда хранить счетчик ссылок на объект.
Во первых,Спасибо за ответы
Во -вторых, Это-то я и сам понимаю, что нужно просто возвращать из IClassFactory::CreateInstance(...) указатель на
один и тот же объект. только вот КАК ЭТО СДЕЛАТЬ, то есть в пределах одного процесса все понятно, а вот если ПРОЦЕССЫ РАЗНЫЕ ???
A>Во -вторых, Это-то я и сам понимаю, что нужно просто возвращать из IClassFactory::CreateInstance(...) указатель на A>один и тот же объект. только вот КАК ЭТО СДЕЛАТЬ, то есть в пределах одного процесса все понятно, а вот если ПРОЦЕССЫ РАЗНЫЕ ???
Примерно так, только добавить синхронизацию и удаление FileMapping'а.
Также лучше перенести создание FileMapping'а в FinalConstruct объекта, а удаление в FinalRelease.
А проверку на уже созданный объект перенести в ClassFactory.
По желанию добавить проверку ошибок.
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте alexei_, Вы писали:
DG>Все выше написаное правильно, но только если объекты создаются из одного процесса. DG>При вызове из РАЗНЫХ процессов будут создаваться РАЗНЫЕ копии dll, поэтому надо проверять нет ли предыдущей копии dll в памяти. Это удобно делать через расшаренную память, и в ней же тогда хранить счетчик ссылок на объект.
А кстати, если эту dll-ку поместить в MTS, будут ли все клиенты работать с 1 экземпляром, или каждый со своим ?
Здравствуйте alexei_, Вы писали:
A>Объясните мне, пожалуйста, A>Как сделать СОМ — объект, такой чтоб он существовал в единственном A>экземпляре, т.е. что бы CoCreateInstance возвращала указатель на один и тот же A>объект (при вызове из разных процессов) A>Желательно без использования MFC или ATL
A>Алексей
во флэйма-то
смотри функции
GetActiveObject
RegisterActiveObject
RevokeActiveObject
а так же вот этот код, он на ATL но суть, я думаю, будет ясна
Здравствуйте George_Seryakov, Вы писали:
GS>Здравствуйте Serge, Вы писали:
S>>А кстати, если эту dll-ку поместить в MTS, будут ли все клиенты работать с 1 экземпляром, или каждый со своим ?
GS> Скорее всего — не получится, поскольку у MTS-а своя собственная фабрика классов, и вмешательства в ее работу он не любит.
Ерунда (и про то что работать не будет, и про фабрику классов). Если объект синглетон, то будет. Даже лучше чем обычный exe.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте VladD2, Вы писали:
GS>> Скорее всего — не получится, поскольку у MTS-а своя собственная фабрика классов, и вмешательства в ее работу он не любит.
VD>Ерунда (и про то что работать не будет, и про фабрику классов). Если объект синглетон, то будет. Даже лучше чем обычный exe.
Но статистику COM+ будет показывать такую, как будто он насоздавал кучу объектов , поэтому легко обмануться.
Кстати, как можно создать противоположного типа объект, чтобы на каждый экземпляр создавалась новая COM+ Application?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте VladD2, Вы писали:
VD>Здравствуйте Edward, Вы писали:
E>>во флэйма-то
VD>А что (по-твоему) значит "флэйма"?
А это значит, что человек задал вопрос
"Как сделать СОМ — объект, такой чтоб он существовал в единственном экземпляре, т.е. что бы CoCreateInstance возвращала указатель на один и тот же объект (при вызове из разных процессов)",
причем вопрос был общий, то есть не уточнялось в Local или Inproc сервере живет объект.
Тут же был дан нормальный ответ с указанием на ATL::CComClassFactorySingleton, ATL::CComObjectGlobal, то есть для обоих случаев.
А потом народ начал в этой нити обсуждать какие-то свои проблемы про GetClassObject и копии Dll в памяти, не имеющие никакого отношения к вопросу, при этом жарко споря.
По моему это и называется флейм — спор ни о чем.
Или я ошибаюсь?
Здравствуйте, alexei_, Вы писали:
A>Объясните мне, пожалуйста, A>Как сделать СОМ — объект, такой чтоб он существовал в единственном A>экземпляре, т.е. что бы CoCreateInstance возвращала указатель на один и тот же A>объект (при вызове из разных процессов) A>Желательно без использования MFC или ATL
A>Алексей
Sorry, ne mogu sejchas kirillicej pisat'.
Otvet na etot vopros ochen' prost. Ne ponimaju pochemu tut stol'ko vsego mudrogo nasovetovali.
Nado sozdat' Out-Of-Process COM Server.