Один на всех
От: Аноним  
Дата: 10.10.03 05:50
Оценка:
Доброго времени суток,
в общем такая проблема, я не совсем знаю как реализовать,
задача:
создать сом объект, что бы он был общий для все приложений, т.е, вновь созданные процессы
получали именно этот объект а не новый его экземпляр, реализовать в принцыпе все равно на чем
или С++ или VB, не важно
Можно или пример или ссылочку
Спасибо большое......
Re: Один на всех
От: UnrealAlex Россия  
Дата: 10.10.03 05:59
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Доброго времени суток,

А>в общем такая проблема, я не совсем знаю как реализовать,
А>задача:
А> создать сом объект, что бы он был общий для все приложений, т.е, вновь созданные процессы
А>получали именно этот объект а не новый его экземпляр, реализовать в принцыпе все равно на чем
А>или С++ или VB, не важно
А> Можно или пример или ссылочку
А>Спасибо большое......
Шаблон проектирования “Одиночка” (Singleton) в ATL приложениях
Автор(ы): Иван Андреев
Дата: 03.08.2003
Описание шаблона проектирования синглетон очень простое — синглетон представляет собой единственный экземпляр класса, с которым работают все клиенты. Применительно к COM шаблон проектирования синглетон гарантирует, что все вызовы CoCreateInstance будут возвращать указатель на интерфейс единственного экземпляра компонента. Удобство использования таких компонентов/классов заключается в том, что клиенты работают с одним и тем же экземпляром, а значит, получают доступ к разделяемому состоянию этого экземпляра. Несмотря на простое описание, не существует "идеальной" реализации этого шаблона ни в языке С++, ни для COM-объектов. Связано это с тем, что любая существующая реализация имеет некоторые ограничения и не может выступать в роли "универсальной" реализации на все случаи жизни.
Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/
Re: Один на всех
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 10.10.03 06:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго времени суток,

А>в общем такая проблема, я не совсем знаю как реализовать,
А>задача:
А> создать сом объект, что бы он был общий для все приложений, т.е, вновь созданные процессы
А>получали именно этот объект а не новый его экземпляр, реализовать в принцыпе все равно на чем
А>или С++ или VB, не важно
А> Можно или пример или ссылочку
А>Спасибо большое......

DECLARE_CLASSFACTORY_SINGLETON ?
Re: Один на всех
От: _Cancel Беларусь  
Дата: 10.10.03 06:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго времени суток,

А>в общем такая проблема, я не совсем знаю как реализовать,
А>задача:
А> создать сом объект, что бы он был общий для все приложений, т.е, вновь созданные процессы
А>получали именно этот объект а не новый его экземпляр, реализовать в принцыпе все равно на чем
А>или С++ или VB, не важно
Все дело в реализации фабрики класса в ATL дабавляешь макрос
DECLARE_CLASSFACTORY_SINGLETON(CMyClass)

и реализуешь все что тебе надо от этого класса

Если захочешь без ATL то делаешь, так чтобы CreateInstance
в твоей фабрике классов возвращал постоянно ссылку на один и тот же обект
не создавая новый
http://clubpro.spb.ru/cominside/index.html
хорошая рассылка когда-то была жаль ща молчит
Re[2]: Один на всех
От: Bai  
Дата: 10.10.03 10:13
Оценка:
Спасибо за совет, но вот еще одни вопрос
делаю так

class ATL_NO_VTABLE CCSingle : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CCSingle, &CLSID_CSingle>,
    public IDispatchImpl<ICSingle, &IID_ICSingle, &LIBID_SINGLELib>
{
private:
    int iTest;
public:
    CCSingle()
    { 
        iTest = 0;
    }

DECLARE_CLASSFACTORY_SINGLETON(CCSingle)

DECLARE_REGISTRY_RESOURCEID(IDR_CSINGLE)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CCSingle)
    COM_INTERFACE_ENTRY(ICSingle)
    COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()

// ICSingle
public:
    STDMETHOD(Test)(/*[in]*/ int i);
};

STDMETHODIMP CCSingle::Test(int i)
{
    // TODO: Add your implementation code here
    iTest += i;
    char* buf = new char[20];
        itoa(iTest, buf, 10);
    MessageBox(NULL, (LPCSTR)buf,"test", MB_OK);
    delete[] buf;
    return S_OK;
}


запускаю два приложения которые создают объект
(вызываю из vb)
и по клику на кнопку вызывают метод тест, если
соответственно первый возвращает 10. 20. 30
и второй тоже 10, 20 , 30
а надо что бы второй возвращал 40,50, 60

только сильно не пинайте если чего не понял я.
Спасибо.
Re[2]: Один на всех
От: Аноним  
Дата: 10.10.03 12:44
Оценка:
Помогите плз,
ничего не получается .......
АУУУУ.
Re[3]: для процессов или для процесса
От: Vi2 Удмуртия http://www.adem.ru
Дата: 10.10.03 13:23
Оценка:
Здравствуйте, Bai, Вы писали:

Bai>запускаю два приложения которые создают объект (вызываю из vb) и по клику на кнопку вызывают метод тест, если
Bai>соответственно первый возвращает 10. 20. 30 и второй тоже 10, 20 , 30 а надо что бы второй возвращал 40,50, 60

Чтобы получить синглетон для процессов, нужно сервер делать out_proc сервером, т.е. EXE-шником. Иначе будет синглетон для процесса, отдельно для каждого.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Один на всех
От: jurgens Россия  
Дата: 11.10.03 16:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Помогите плз,

А>ничего не получается .......
А>АУУУУ.

Необязательно делать exe сервер.
При создании объекта можно сначала вызывать GetActiveObject с CLSID нужного класса.
Если ничего не нашлось, то создавать новый объект.
Объект в конструкторе должен звать RegisterActiveObject, а в деструкторе RevokeActiveObject. Нормально работает и с in-proc серверами.
Re[4]: для процессов или для процесса
От: Bai  
Дата: 12.10.03 09:48
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, Bai, Вы писали:


Vi2>

Bai>>запускаю два приложения которые создают объект (вызываю из vb) и по клику на кнопку вызывают метод тест, если
Bai>>соответственно первый возвращает 10. 20. 30 и второй тоже 10, 20 , 30 а надо что бы второй возвращал 40,50, 60

Vi2>Чтобы получить синглетон для процессов, нужно сервер делать out_proc сервером, т.е. EXE-шником. Иначе будет синглетон для процесса, отдельно для каждого.
Огромное спасибо.
Сделал out_proc, все работает!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.