Здраствуйте!
У меня проблема:
Есть DLL, написанная на Visual C++
Внутри нее есть объект, который в конструкторе открывает порт, в деструкторе закрывает порт, сам по таймеру читает из порта. У этого объекта есть
метод read который позволяет добраться до массива с данными, прочитанными ранее из порта.
Есть 3 программы написанные на Visual Basic-е. Которые используют CreateObject и должны считывать данные порта путем использования метода read описанного выше объекта.
Проблема вот в чем: т.к каждая из VB программ использует CreatObject, то и объектов плодится 3 штуки, каждый из которых в конструкторе пытается открывать порт и соответственно, обламывается.
Я хочу чтоб объект создавался 1 раз, а 2 другие программы просто обращались бы с помощью метода read к одному и тому же массиву.
Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.
kpn>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.
Для этого при первом запуске регистрируешь свой объект в ROT — таблице работающих объектов. Для этого есть функции: RegisterActiveObject — для регистрации и RevokeActiveObject — для дерегистрации.
После этого объект доступен (почти) всем клиентам через GetActiveObject (и ее аналог GetObject в VB).
НО!
Такой сервер должен быть быть не in-proc сервером, а out-proc сервером, чтобы не зависеть от порождающего первый объект клиента. Т.е. этот сервер должен быть или EXE сервером, или суррогатный процессом для DLL сервера. Ну или стопорить (т.е. не давать завершиться) первого клиента, который породил объект, и заставлять его фактически выполнять роль EXE сервера.
Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, kpn, Вы писали:
Vi2>
kpn>>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.
Vi2>Для этого при первом запуске регистрируешь свой объект в ROT — таблице работающих объектов. Для этого есть функции: RegisterActiveObject — для регистрации и RevokeActiveObject — для дерегистрации. Vi2>После этого объект доступен (почти) всем клиентам через GetActiveObject (и ее аналог GetObject в VB).
А если через singleton макрос?
Vi2>НО! Vi2>Такой сервер должен быть быть не in-proc сервером, а out-proc сервером, чтобы не зависеть от порождающего первый объект клиента. Т.е. этот сервер должен быть или EXE сервером, или суррогатный процессом для DLL сервера. Ну или стопорить (т.е. не давать завершиться) первого клиента, который породил объект, и заставлять его фактически выполнять роль EXE сервера.
"Прогресс сделал розетки недоступными большинству детей, — умирают самые одаренные..."
kpn>>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.
Vi2>Для этого при первом запуске регистрируешь свой объект в ROT — таблице работающих объектов. Для этого есть функции: RegisterActiveObject — для регистрации и RevokeActiveObject — для дерегистрации. Vi2>После этого объект доступен (почти) всем клиентам через GetActiveObject (и ее аналог GetObject в VB).
Vi2>НО! Vi2>Такой сервер должен быть быть не in-proc сервером, а out-proc сервером, чтобы не зависеть от порождающего первый объект клиента. Т.е. этот сервер должен быть или EXE сервером, или суррогатный процессом для DLL сервера. Ну или стопорить (т.е. не давать завершиться) первого клиента, который породил объект, и заставлять его фактически выполнять роль EXE сервера.
А что, если роль этого сервера будет выполнять одна из этих 3-х программ написанных на VB?? Это возможно?
Registeractiveobject мне где нужно вызывать в DLL или нет??
Если есть время, то объясни пожалуйста поподробнее о том как это нужно сделать и о процессах которые происходят при CreateObject и при Getobject!
Если есть где-нибудь рабочий пример, то кинь пожалуйста ссылочку!
Здравствуйте, LaFlour, Вы писали:
kpn>>>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.[/q] Vi2>>Для этого при первом запуске регистрируешь свой объект в ROT — таблице работающих объектов. Для этого есть функции: RegisterActiveObject — для регистрации и RevokeActiveObject — для дерегистрации. Vi2>>После этого объект доступен (почти) всем клиентам через GetActiveObject (и ее аналог GetObject в VB).
LF>А если через singleton макрос?
а что это за макрос такой и с чем его едят?
Здравствуйте, kpn, Вы писали:
kpn>Здравствуйте, LaFlour, Вы писали:
kpn>>>>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.[/q] Vi2>>>Для этого при первом запуске регистрируешь свой объект в ROT — таблице работающих объектов. Для этого есть функции: RegisterActiveObject — для регистрации и RevokeActiveObject — для дерегистрации. Vi2>>>После этого объект доступен (почти) всем клиентам через GetActiveObject (и ее аналог GetObject в VB).
LF>>А если через singleton макрос? kpn>а что это за макрос такой и с чем его едят?
LF>>>А если через singleton макрос? kpn>>а что это за макрос такой и с чем его едят?
LF>DECLARE_CLASSFACTORY_SINGLETON(CMyClass) LF>попробуй.
за идею спасибо! сейчас прочитал про синглетоны- интересная штука!!!
только вот в чем проблема.. все, что я видел- это Singleton для процесса, а вот как сделать, что бы все процессы в системе использовали один и тот же объект?
LF>>>>А если через singleton макрос? kpn>>>а что это за макрос такой и с чем его едят?
LF>>DECLARE_CLASSFACTORY_SINGLETON(CMyClass) LF>>попробуй. kpn>за идею спасибо! сейчас прочитал про синглетоны- интересная штука!!! kpn>только вот в чем проблема.. все, что я видел- это Singleton для процесса, а вот как сделать, что бы все процессы в системе использовали один и тот же объект?
Делай сурроргатный, если влом переписывать DLL, или out-proc сервер
"Прогресс сделал розетки недоступными большинству детей, — умирают самые одаренные..."
Здравствуйте, LaFlour, Вы писали:
kpn>>за идею спасибо! сейчас прочитал про синглетоны- интересная штука!!! kpn>>только вот в чем проблема.. все, что я видел- это Singleton для процесса, а вот как сделать, что бы все процессы в системе использовали один и тот же объект? LF>Делай сурроргатный, если влом переписывать DLL, или out-proc сервер
DLL переписать-то не влом, вопрос в том- как...
Насчет Outproc- на сколько я понимаю, это будет отдельный exe-шник, или можно все же в DLL его как-то засунуть??
Ты меня извини за глупые вопросы, я еще новичок в данной области. Что значит СУРРОГАТНЫЙ?? Объясни поподробнее что да как сделать или дай ссылочку почитать.
Здравствуйте, kpn, Вы писали:
kpn>Здравствуйте, LaFlour, Вы писали:
kpn>>>за идею спасибо! сейчас прочитал про синглетоны- интересная штука!!! kpn>>>только вот в чем проблема.. все, что я видел- это Singleton для процесса, а вот как сделать, что бы все процессы в системе использовали один и тот же объект? LF>>Делай сурроргатный, если влом переписывать DLL, или out-proc сервер
kpn>DLL переписать-то не влом, вопрос в том- как... kpn>Насчет Outproc- на сколько я понимаю, это будет отдельный exe-шник, или можно все же в DLL его как-то засунуть??
kpn>Ты меня извини за глупые вопросы, я еще новичок в данной области. Что значит СУРРОГАТНЫЙ?? Объясни поподробнее что да как сделать или дай ссылочку почитать.
есть такая программа Dllhost, которая делает из твоей dll — DCOM сервер, делаешь его потом синглетоном и работаешь
как ни в чем не бывало
Настраивается это в dcom-e
Купи книгу Трельсона и почитай. куча вопросов отпадет
kpn>>Ты меня извини за глупые вопросы, я еще новичок в данной области. Что значит СУРРОГАТНЫЙ?? Объясни поподробнее что да как сделать или дай ссылочку почитать. LF>есть такая программа Dllhost, которая делает из твоей dll — DCOM сервер, делаешь его потом синглетоном и работаешь LF>как ни в чем не бывало
я почитал чуток про эти суррогатные сервера... но, насколько я понял, это все актуально для Nt,2000,Xp. Мне же надо, чтобы программа работала под win98
kpn>>>Ты меня извини за глупые вопросы, я еще новичок в данной области. Что значит СУРРОГАТНЫЙ?? Объясни поподробнее что да как сделать или дай ссылочку почитать. LF>>есть такая программа Dllhost, которая делает из твоей dll — DCOM сервер, делаешь его потом синглетоном и работаешь LF>>как ни в чем не бывало kpn>я почитал чуток про эти суррогатные сервера... но, насколько я понял, это все актуально для Nt,2000,Xp. Мне же надо, чтобы программа работала под win98
Надо иметь к себе хоть каплю уважения
забей, 98я это не винда
Здравствуйте, kpn, Вы писали:
kpn>Здраствуйте! kpn>У меня проблема: kpn>Есть DLL, написанная на Visual C++ kpn>Внутри нее есть объект, который в конструкторе открывает порт, в деструкторе закрывает порт, сам по таймеру читает из порта. У этого объекта есть kpn>метод read который позволяет добраться до массива с данными, прочитанными ранее из порта.
kpn>Есть 3 программы написанные на Visual Basic-е. Которые используют CreateObject и должны считывать данные порта путем использования метода read описанного выше объекта.
kpn>Проблема вот в чем: т.к каждая из VB программ использует CreatObject, то и объектов плодится 3 штуки, каждый из которых в конструкторе пытается открывать порт и соответственно, обламывается.
kpn>Я хочу чтоб объект создавался 1 раз, а 2 другие программы просто обращались бы с помощью метода read к одному и тому же массиву.
kpn>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.
Если ATL, то можно попробовать DECLARE_CLASSFACTORY_SINGLETON
(желательно ка сервес а не dll)
Здравствуйте, KGP, Вы писали:
KGP>Здравствуйте, kpn, Вы писали:
kpn>>Здраствуйте! kpn>>У меня проблема: kpn>>Есть DLL, написанная на Visual C++ kpn>>Внутри нее есть объект, который в конструкторе открывает порт, в деструкторе закрывает порт, сам по таймеру читает из порта. У этого объекта есть kpn>>метод read который позволяет добраться до массива с данными, прочитанными ранее из порта.
kpn>>Есть 3 программы написанные на Visual Basic-е. Которые используют CreateObject и должны считывать данные порта путем использования метода read описанного выше объекта.
kpn>>Проблема вот в чем: т.к каждая из VB программ использует CreatObject, то и объектов плодится 3 штуки, каждый из которых в конструкторе пытается открывать порт и соответственно, обламывается.
kpn>>Я хочу чтоб объект создавался 1 раз, а 2 другие программы просто обращались бы с помощью метода read к одному и тому же массиву.
kpn>>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.
KGP>Если ATL, то можно попробовать DECLARE_CLASSFACTORY_SINGLETON KGP>(желательно ка сервес а не dll)
Интересно ты сообщения вообще читаешь? или сразу отвечаешь?
"Прогресс сделал розетки недоступными большинству детей, — умирают самые одаренные..."
Здравствуйте, LaFlour, Вы писали:
kpn>>я почитал чуток про эти суррогатные сервера... но, насколько я понял, это все актуально для Nt,2000,Xp. Мне же надо, чтобы программа работала под win98 LF> LF> Надо иметь к себе хоть каплю уважения LF> забей, 98я это не винда
Насчет того, что это не винда- согласен, но вот договор составлялся без моего участия и там написано 98/2000/xp ...
Кстати, по ходу дела, суррогаты могут работать и под 98, но как COM сервер, а не DCOM....
Здравствуйте, kpn, Вы писали:
kpn>Здравствуйте, LaFlour, Вы писали:
kpn>>>я почитал чуток про эти суррогатные сервера... но, насколько я понял, это все актуально для Nt,2000,Xp. Мне же надо, чтобы программа работала под win98 LF>> LF>> Надо иметь к себе хоть каплю уважения LF>> забей, 98я это не винда kpn>Насчет того, что это не винда- согласен, но вот договор составлялся без моего участия и там написано 98/2000/xp ... kpn>Кстати, по ходу дела, суррогаты могут работать и под 98, но как COM сервер, а не DCOM....
а если попробывать на винду 98 фреймворк поставить дотнетовский?
тама есть суррогаты или нет?
"Прогресс сделал розетки недоступными большинству детей, — умирают самые одаренные..."
Здравствуйте, LaFlour, Вы писали:
LF>Здравствуйте, KGP, Вы писали:
KGP>>Здравствуйте, kpn, Вы писали:
kpn>>>Здраствуйте! kpn>>>У меня проблема: kpn>>>Есть DLL, написанная на Visual C++ kpn>>>Внутри нее есть объект, который в конструкторе открывает порт, в деструкторе закрывает порт, сам по таймеру читает из порта. У этого объекта есть kpn>>>метод read который позволяет добраться до массива с данными, прочитанными ранее из порта.
kpn>>>Есть 3 программы написанные на Visual Basic-е. Которые используют CreateObject и должны считывать данные порта путем использования метода read описанного выше объекта.
kpn>>>Проблема вот в чем: т.к каждая из VB программ использует CreatObject, то и объектов плодится 3 штуки, каждый из которых в конструкторе пытается открывать порт и соответственно, обламывается.
kpn>>>Я хочу чтоб объект создавался 1 раз, а 2 другие программы просто обращались бы с помощью метода read к одному и тому же массиву.
kpn>>>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.
KGP>>Если ATL, то можно попробовать DECLARE_CLASSFACTORY_SINGLETON KGP>>(желательно ка сервес а не dll) LF>Интересно ты сообщения вообще читаешь? или сразу отвечаешь?
Читаю — делаешь exe (скрытое) с DECLARE_CLASSFACTORY_SINGLETON
шаред ресурс для подсчёта кол-ва запустившихся.
Непервая закрывается. остается только 2-я.
Работает под 98 на ура — один exe только висит, а COM тоже на нём один.
Это если проблемы с сервисом (98) ... могбы и уточнить, что от сервисов до exe не перешла мысля ...
А то как танкист
kpn>>Кстати, по ходу дела, суррогаты могут работать и под 98, но как COM сервер, а не DCOM.... LF>а если попробывать на винду 98 фреймворк поставить дотнетовский? LF>тама есть суррогаты или нет?
про дотнет- не знаю, а вот MSDN 2003 года говорит, что суррогаты есть везде, даже в 98-ых
вот тебе ссылочка: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/reg_6xyd.asp?frame=true. Если тыкнуть на CoRegisterSurrogate, то в конце странички в requirements написано, что работает везде
кстати, попробовал сделать Outproc сервер в виде отдельного ехе-шника. Под ХР получается интересный эффект, который я никак не ожидал- при запуске клиента автоматически запускается сервер....
Тут еще 1 интересный вопрос — можно ли безболезненно изменить ProcId с Server002.UsbControl на MyProcId или это чем-то грозит??
Здравствуйте, KGP, Вы писали:
KGP>Читаю — делаешь exe (скрытое) с DECLARE_CLASSFACTORY_SINGLETON
что значит скрытое?
KGP>шаред ресурс для подсчёта кол-ва запустившихся. KGP>Непервая закрывается. остается только 2-я.
тоже не понял о чем это ты... если это синглетон, то он сам все делает, кого считать и зачем — не понял
KGP>Работает под 98 на ура — один exe только висит, а COM тоже на нём один.
объект тоже 1, ты имеешь ввиду??
KGP>Это если проблемы с сервисом (98) ... могбы и уточнить, что от сервисов до exe не перешла мысля ...
дошла, дошла... просто LeFlour до конца объяснять все не стал и я уже сам додумался!
Из твоего вышенаписанного я, честно говоря, не все понял, но все равно- спасибо большое за содействие!
Здравствуйте, kpn, Вы писали:
kpn>Здравствуйте, KGP, Вы писали:
KGP>>Читаю — делаешь exe (скрытое) с DECLARE_CLASSFACTORY_SINGLETON kpn>что значит скрытое?
чтоб exe без видимости был ...
KGP>>шаред ресурс для подсчёта кол-ва запустившихся. KGP>>Непервая закрывается. остается только 2-я. kpn>тоже не понял о чем это ты... если это синглетон, то он сам все делает, кого считать и зачем — не понял
у меня exe всё равно иногда два запускается, не смотря на то, что DECLARE_CLASSFACTORY_SINGLETON
kpn>объект тоже 1, ты имеешь ввиду??
да COM-объект
kpn>Из твоего вышенаписанного я, честно говоря, не все понял, но все равно- спасибо большое за содействие!