Кто знает про технологию Automation??
От: kpn  
Дата: 15.09.03 17:22
Оценка:
Здраствуйте!
У меня проблема:
Есть DLL, написанная на Visual C++
Внутри нее есть объект, который в конструкторе открывает порт, в деструкторе закрывает порт, сам по таймеру читает из порта. У этого объекта есть
метод read который позволяет добраться до массива с данными, прочитанными ранее из порта.

Есть 3 программы написанные на Visual Basic-е. Которые используют CreateObject и должны считывать данные порта путем использования метода read описанного выше объекта.

Проблема вот в чем: т.к каждая из VB программ использует CreatObject, то и объектов плодится 3 штуки, каждый из которых в конструкторе пытается открывать порт и соответственно, обламывается.

Я хочу чтоб объект создавался 1 раз, а 2 другие программы просто обращались бы с помощью метода read к одному и тому же массиву.

Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.
Re: Про GetObject
От: Vi2 Удмуртия http://www.adem.ru
Дата: 16.09.03 04:18
Оценка: 23 (3)
Здравствуйте, kpn, Вы писали:

kpn>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.

Для этого при первом запуске регистрируешь свой объект в ROT — таблице работающих объектов. Для этого есть функции: RegisterActiveObject — для регистрации и RevokeActiveObject — для дерегистрации.
После этого объект доступен (почти) всем клиентам через GetActiveObject (и ее аналог GetObject в VB).

НО!
Такой сервер должен быть быть не in-proc сервером, а out-proc сервером, чтобы не зависеть от порождающего первый объект клиента. Т.е. этот сервер должен быть или EXE сервером, или суррогатный процессом для DLL сервера. Ну или стопорить (т.е. не давать завершиться) первого клиента, который породил объект, и заставлять его фактически выполнять роль EXE сервера.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Про GetObject
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 16.09.03 05:44
Оценка:
Здравствуйте, Vi2, Вы писали:

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


Vi2>

kpn>>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.

Vi2>Для этого при первом запуске регистрируешь свой объект в ROT — таблице работающих объектов. Для этого есть функции: RegisterActiveObject — для регистрации и RevokeActiveObject — для дерегистрации.
Vi2>После этого объект доступен (почти) всем клиентам через GetActiveObject (и ее аналог GetObject в VB).

А если через singleton макрос?

Vi2>НО!

Vi2>Такой сервер должен быть быть не in-proc сервером, а out-proc сервером, чтобы не зависеть от порождающего первый объект клиента. Т.е. этот сервер должен быть или EXE сервером, или суррогатный процессом для DLL сервера. Ну или стопорить (т.е. не давать завершиться) первого клиента, который породил объект, и заставлять его фактически выполнять роль EXE сервера.

"Прогресс сделал розетки недоступными большинству детей, — умирают самые одаренные..."

Re[2]: Про GetObject
От: kpn  
Дата: 16.09.03 07:26
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>

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!
Если есть где-нибудь рабочий пример, то кинь пожалуйста ссылочку!
Re[3]: Про GetObject
От: kpn  
Дата: 16.09.03 07:28
Оценка:
Здравствуйте, LaFlour, Вы писали:

kpn>>>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.[/q]

Vi2>>Для этого при первом запуске регистрируешь свой объект в ROT — таблице работающих объектов. Для этого есть функции: RegisterActiveObject — для регистрации и RevokeActiveObject — для дерегистрации.
Vi2>>После этого объект доступен (почти) всем клиентам через GetActiveObject (и ее аналог GetObject в VB).

LF>А если через singleton макрос?

а что это за макрос такой и с чем его едят?
Re[4]: Про GetObject
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 16.09.03 08:44
Оценка:
Здравствуйте, kpn, Вы писали:

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


kpn>>>>Как мне это лучше всего сделать???? Вроде есть какая-то штука типа GetObject, но как ей пользоваться- не очень понял.[/q]

Vi2>>>Для этого при первом запуске регистрируешь свой объект в ROT — таблице работающих объектов. Для этого есть функции: RegisterActiveObject — для регистрации и RevokeActiveObject — для дерегистрации.
Vi2>>>После этого объект доступен (почти) всем клиентам через GetActiveObject (и ее аналог GetObject в VB).

LF>>А если через singleton макрос?

kpn>а что это за макрос такой и с чем его едят?

DECLARE_CLASSFACTORY_SINGLETON(CMyClass)
попробуй.

"Прогресс сделал розетки недоступными большинству детей, — умирают самые одаренные..."

Re[5]: Про GetObject
От: kpn  
Дата: 16.09.03 09:20
Оценка:
LF>>>А если через singleton макрос?
kpn>>а что это за макрос такой и с чем его едят?

LF>DECLARE_CLASSFACTORY_SINGLETON(CMyClass)

LF>попробуй.
за идею спасибо! сейчас прочитал про синглетоны- интересная штука!!!
только вот в чем проблема.. все, что я видел- это Singleton для процесса, а вот как сделать, что бы все процессы в системе использовали один и тот же объект?
Re[6]: Про GetObject
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 16.09.03 09:43
Оценка:
Здравствуйте, kpn, Вы писали:


LF>>>>А если через singleton макрос?

kpn>>>а что это за макрос такой и с чем его едят?

LF>>DECLARE_CLASSFACTORY_SINGLETON(CMyClass)

LF>>попробуй.
kpn>за идею спасибо! сейчас прочитал про синглетоны- интересная штука!!!
kpn>только вот в чем проблема.. все, что я видел- это Singleton для процесса, а вот как сделать, что бы все процессы в системе использовали один и тот же объект?
Делай сурроргатный, если влом переписывать DLL, или out-proc сервер

"Прогресс сделал розетки недоступными большинству детей, — умирают самые одаренные..."

Re[7]: Про GetObject
От: kpn  
Дата: 16.09.03 14:45
Оценка:
Здравствуйте, LaFlour, Вы писали:

kpn>>за идею спасибо! сейчас прочитал про синглетоны- интересная штука!!!

kpn>>только вот в чем проблема.. все, что я видел- это Singleton для процесса, а вот как сделать, что бы все процессы в системе использовали один и тот же объект?
LF>Делай сурроргатный, если влом переписывать DLL, или out-proc сервер

DLL переписать-то не влом, вопрос в том- как...
Насчет Outproc- на сколько я понимаю, это будет отдельный exe-шник, или можно все же в DLL его как-то засунуть??

Ты меня извини за глупые вопросы, я еще новичок в данной области. Что значит СУРРОГАТНЫЙ?? Объясни поподробнее что да как сделать или дай ссылочку почитать.
Re[8]: Про GetObject
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 16.09.03 16:23
Оценка:
Здравствуйте, kpn, Вы писали:

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


kpn>>>за идею спасибо! сейчас прочитал про синглетоны- интересная штука!!!

kpn>>>только вот в чем проблема.. все, что я видел- это Singleton для процесса, а вот как сделать, что бы все процессы в системе использовали один и тот же объект?
LF>>Делай сурроргатный, если влом переписывать DLL, или out-proc сервер

kpn>DLL переписать-то не влом, вопрос в том- как...

kpn>Насчет Outproc- на сколько я понимаю, это будет отдельный exe-шник, или можно все же в DLL его как-то засунуть??

kpn>Ты меня извини за глупые вопросы, я еще новичок в данной области. Что значит СУРРОГАТНЫЙ?? Объясни поподробнее что да как сделать или дай ссылочку почитать.

есть такая программа Dllhost, которая делает из твоей dll — DCOM сервер, делаешь его потом синглетоном и работаешь
как ни в чем не бывало
Настраивается это в dcom-e
Купи книгу Трельсона и почитай. куча вопросов отпадет
Re[9]: Про GetObject
От: kpn  
Дата: 16.09.03 18:05
Оценка:
kpn>>Ты меня извини за глупые вопросы, я еще новичок в данной области. Что значит СУРРОГАТНЫЙ?? Объясни поподробнее что да как сделать или дай ссылочку почитать.
LF>есть такая программа Dllhost, которая делает из твоей dll — DCOM сервер, делаешь его потом синглетоном и работаешь
LF>как ни в чем не бывало
я почитал чуток про эти суррогатные сервера... но, насколько я понял, это все актуально для Nt,2000,Xp. Мне же надо, чтобы программа работала под win98
Re[10]: Про GetObject
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 17.09.03 04:16
Оценка:
Здравствуйте, kpn, Вы писали:


kpn>>>Ты меня извини за глупые вопросы, я еще новичок в данной области. Что значит СУРРОГАТНЫЙ?? Объясни поподробнее что да как сделать или дай ссылочку почитать.

LF>>есть такая программа Dllhost, которая делает из твоей dll — DCOM сервер, делаешь его потом синглетоном и работаешь
LF>>как ни в чем не бывало
kpn>я почитал чуток про эти суррогатные сервера... но, насколько я понял, это все актуально для Nt,2000,Xp. Мне же надо, чтобы программа работала под win98

Надо иметь к себе хоть каплю уважения
забей, 98я это не винда

"Настал день Ч, время Х и полная Ж."

Re: Кто знает про технологию Automation??
От: KGP http://kornilow.newmail.ru
Дата: 17.09.03 06:20
Оценка:
Здравствуйте, 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)
Re[2]: Кто знает про технологию Automation??
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 17.09.03 06:42
Оценка:
Здравствуйте, 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)
Интересно ты сообщения вообще читаешь? или сразу отвечаешь?

"Прогресс сделал розетки недоступными большинству детей, — умирают самые одаренные..."

Re[11]: Про GetObject
От: kpn  
Дата: 17.09.03 06:57
Оценка:
Здравствуйте, LaFlour, Вы писали:

kpn>>я почитал чуток про эти суррогатные сервера... но, насколько я понял, это все актуально для Nt,2000,Xp. Мне же надо, чтобы программа работала под win98

LF>
LF> Надо иметь к себе хоть каплю уважения
LF> забей, 98я это не винда
Насчет того, что это не винда- согласен, но вот договор составлялся без моего участия и там написано 98/2000/xp ...
Кстати, по ходу дела, суррогаты могут работать и под 98, но как COM сервер, а не DCOM....
Re[12]: Про GetObject
От: LaFlour Австралия blog: http://spaces.live.com/laflour
Дата: 17.09.03 07:34
Оценка:
Здравствуйте, kpn, Вы писали:

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


kpn>>>я почитал чуток про эти суррогатные сервера... но, насколько я понял, это все актуально для Nt,2000,Xp. Мне же надо, чтобы программа работала под win98

LF>>
LF>> Надо иметь к себе хоть каплю уважения
LF>> забей, 98я это не винда
kpn>Насчет того, что это не винда- согласен, но вот договор составлялся без моего участия и там написано 98/2000/xp ...
kpn>Кстати, по ходу дела, суррогаты могут работать и под 98, но как COM сервер, а не DCOM....
а если попробывать на винду 98 фреймворк поставить дотнетовский?
тама есть суррогаты или нет?

"Прогресс сделал розетки недоступными большинству детей, — умирают самые одаренные..."

Re[3]: Кто знает про технологию Automation??
От: KGP http://kornilow.newmail.ru
Дата: 17.09.03 10:52
Оценка:
Здравствуйте, 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 не перешла мысля ...
А то как танкист
Re[13]: Про GetObject
От: kpn  
Дата: 17.09.03 19:04
Оценка:
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 или это чем-то грозит??
Re[4]: Кто знает про технологию Automation??
От: kpn  
Дата: 17.09.03 19:09
Оценка:
Здравствуйте, KGP, Вы писали:

KGP>Читаю — делаешь exe (скрытое) с DECLARE_CLASSFACTORY_SINGLETON

что значит скрытое?

KGP>шаред ресурс для подсчёта кол-ва запустившихся.

KGP>Непервая закрывается. остается только 2-я.
тоже не понял о чем это ты... если это синглетон, то он сам все делает, кого считать и зачем — не понял

KGP>Работает под 98 на ура — один exe только висит, а COM тоже на нём один.

объект тоже 1, ты имеешь ввиду??

KGP>Это если проблемы с сервисом (98) ... могбы и уточнить, что от сервисов до exe не перешла мысля ...

дошла, дошла... просто LeFlour до конца объяснять все не стал и я уже сам додумался!

Из твоего вышенаписанного я, честно говоря, не все понял, но все равно- спасибо большое за содействие!
Re[5]: Кто знает про технологию Automation??
От: KGP http://kornilow.newmail.ru
Дата: 18.09.03 07:46
Оценка:
Здравствуйте, kpn, Вы писали:

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


KGP>>Читаю — делаешь exe (скрытое) с DECLARE_CLASSFACTORY_SINGLETON

kpn>что значит скрытое?

чтоб exe без видимости был ...

KGP>>шаред ресурс для подсчёта кол-ва запустившихся.

KGP>>Непервая закрывается. остается только 2-я.
kpn>тоже не понял о чем это ты... если это синглетон, то он сам все делает, кого считать и зачем — не понял

у меня exe всё равно иногда два запускается, не смотря на то, что DECLARE_CLASSFACTORY_SINGLETON

kpn>объект тоже 1, ты имеешь ввиду??

да COM-объект

kpn>Из твоего вышенаписанного я, честно говоря, не все понял, но все равно- спасибо большое за содействие!


Лишь бы процесс пошёл ...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.