Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) ВК для асинхронной обработки событий COM-объектов. (число прочтений - 63377 )
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
ВК для асинхронной обработки событий COM-объектов.
12. Июля 2006 :: 06:12
Печать  
EventProxy - ВК для асинхронной обработки событий COM-объектов.

Содержит единственный объект [b]EventProxy[/b].

Свойства:
[list][*][b]ГлубинаБуфераСобытий[/b](EventBufferDepth) - глубина буфера событий интерфейса IAsyncEvent
[*][b]ГлобальныйКонтекст[/b](GlobalContext) - собственно он и есть[/list]

Методы:
[list][*][b]Источник[/b] (Source)  Устанавливает источник событий.
  параметры:
  [list][*]Источник - собственно источник событий.
  [*]ProgID - ProgID источника (По этому ProgID определяются DISPID и имена событий)
  [*]ИмяИсточника - имя источника событий, как оно будет передано в процедуру ОбработкаВнешнегоСобытия[/list]
[*][b]ПолучитьОбъект[/b] (GetObject)
  передает свой единственный параметр в ф-ю CoGetObject и возвращает полученный объект
  (аналог GetObject в VB)
[*][b]Сериализовать[/b]
  сериализует переданный параметр при помощи ObjRefMoniker[/list]

При вызове метода "Источник", EventProxy подписывается на события источника.
При получении события оно передается в 1С через IAsyncEvent.
В процедуре [i]ОбработкаВнешнегоСобытия(Источник, Событие, Данные)[/i]
аргумент [i]"Данные"[/i] содержит сериализованный список значений с параметрами события.
Для десериализации параметров события необходимо вызвать функцию ЗначениеИзСтрокиВнутр(Данные).
Параметры с типом VT_DISPATCH сериализуются при помощи ObjRefMoniker и могут быть десериализованы
методом [i]"ПолучитьОбъект"[/i].

Пример использования:[code]Перем Аутлук,ОбработчикСобытий;

Процедура ПриОткрытии()
     ЗагрузитьВнешнююКомпоненту("EventProxy.dll");
     Аутлук=СоздатьОбъект("Outlook.Application");
     ОбработчикСобытий=СоздатьОбъект("Addin.EventProxy");
     ОбработчикСобытий.ГлубинаБуфераСобытий=200;
     ОбработчикСобытий.Источник(Аутлук,"Outlook.Application","Аутглюк");
КонецПроцедуры      // ПриОткрытии

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
     Если (Источник="Аутглюк") и (Событие="ItemSend") Тогда
           Письмо=ОбработчикСобытий.ПолучитьОбъект(Лев(Данные,СтрДлина(Данные)-3));
           Сообщить(Письмо.Subject);
     КонецЕсли;
КонецПроцедуры      // ОбработкаВнешнегоСобытия[/code]
« Последняя редакция: 17. Марта 2008 :: 13:34 - steban »  

EventProxy_001.rar ( 16 KB | Загрузки )

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #1 - 12. Июля 2006 :: 06:26
Печать  
Иес! Спасибочки, сейчас запробую!


А что в не состав в 1cpp?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #2 - 12. Июля 2006 :: 06:27
Печать  
Принимаются предложения как покрасИвше реализовать сериализацию параметров (чтобы было легко разбирать строку).
А также чтобы обойти грабли с параметрами типа строка, в которой встречается разделитель "|"
« Последняя редакция: 12. Июля 2006 :: 09:46 - steban »  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #3 - 12. Июля 2006 :: 06:32
Печать  
Arta писал(а) 12. Июля 2006 :: 06:26:
А что в не состав в 1cpp?

Если очень надо, можно и в 1С++.
Я там использовал реализацию ILanguageExtender а-ля CMyContextBase : CBLContext   в 1С++ (карты методов и свойств).
Так что технически это делается просто.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #4 - 12. Июля 2006 :: 06:45
Печать  
Кстати, метод ПолучитьОбъект можно использовать и не по назначению Улыбка.
Например так:
Код
Выбрать все
Док=ОбработчикСобытий.ПолучитьОбъект("ПрайсЛист.xls") 


или так:
Код
Выбрать все
6:") 


или даже так:
Код
Выбрать все
Стек=ОбработчикСобытий.ПолучитьОбъект("dm.net:['mscorlib']System.Collections.Stack") 


последний вариант заработает если установить dm.net COM Moniker
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #5 - 12. Июля 2006 :: 07:58
Печать  
Добавлю: поскольку обработка событий в 1С идет в асинхронном режиме, следует соблюдать осторожность при использовании параметров, восстановленных из ссылки ObjRef, т.к. к тому времени, когда у 1С появится время обработать внешнее событие, объект может прекратить свое существование.

Кстати ObjRef-ссылку можно передать каким-либо образом на другую машину и провести там десериализацию Улыбка.
При этом будет создано RPC-соединение к объекту Класс.

ЗЫ: Я вот думаю, может добавить метод сериализовать для создания ObjRef-ссылок на произвольные объекты?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
jbond
Full Member
***
Отсутствует


1С++ Programmer

Сообщений: 140
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #6 - 12. Июля 2006 :: 08:07
Печать  
Т.е. можно обрабатывать события WMI в в 1С коде?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #7 - 12. Июля 2006 :: 08:14
Печать  
steban писал(а) 12. Июля 2006 :: 07:58:
может добавить метод сериализовать для создания ObjRef-ссылок на произвольные объекты?

Сделал. Изменил 1-й пост. Качать там-же.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #8 - 12. Июля 2006 :: 08:15
Печать  
jbond писал(а) 12. Июля 2006 :: 08:07:
Т.е. можно обрабатывать события WMI в в 1С коде?

Наверное..... покажи как это делается в нормальных языках....
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
jbond
Full Member
***
Отсутствует


1С++ Programmer

Сообщений: 140
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #9 - 12. Июля 2006 :: 08:37
Печать  
Взято из admscript.chm

Const POPUP_DURATION = 10
Const OK_BUTTON = 0
Set objWSHShell = Wscript.CreateObject("Wscript.Shell")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIService.InstancesOfAsync objSink, "Win32_NTLogEvent"
Error = objWshShell.Popup("Starting event retrieval", POPUP_DURATION, _
    "Event Retrieval", OK_BUTTON)
Sub SINK_OnCompleted(iHResult, objErrorObject, objAsyncContext)
    WScript.Echo "Asynchronous operation is done."
End Sub
Sub SINK_OnObjectReady(objEvent, objAsyncContext)
    Wscript.Echo "Category: " & objEvent.Category
    Wscript.Echo "Computer Name: " & objEvent.ComputerName
    Wscript.Echo "Event Code: " & objEvent.EventCode
    Wscript.Echo "Message: " & objEvent.Message
    Wscript.Echo "Record Number: " & objEvent.RecordNumber
    Wscript.Echo "Source Name: " & objEvent.SourceName
    Wscript.Echo "Time Written: " & objEvent.TimeWritten
    Wscript.Echo "Event Type: " & objEvent.Type
    Wscript.Echo "User: " & objEvent.User
End Sub
  
Наверх
 
IP записан
 
jbond
Full Member
***
Отсутствует


1С++ Programmer

Сообщений: 140
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #10 - 12. Июля 2006 :: 08:39
Печать  
Const POPUP_DURATION = 120
Const OK_BUTTON = 0
Set objWSHShell = Wscript.CreateObject("Wscript.Shell")
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set objSink = WScript.CreateObject("WbemScripting.SWbemSink","SINK_")
objWMIService.ExecQueryAsync objSink, "Select * from CIM_DataFile"
objPopup = objWshShell.Popup("Starting event retrieval", _
    POPUP_DURATION, "Event Retrieval", OK_BUTTON)
Sub SINK_OnObjectReady(objEvent, objAsyncContext)
    Wscript.Echo objEvent.Name
End Sub

     
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #11 - 12. Июля 2006 :: 08:51
Печать  
Попробовал отлавливать события изменения реестра - получилось.
[code]Перем Обработчик, ОбработчикСобытий;

Процедура ПриОткрытии()
     ЗагрузитьВнешнююКомпоненту("EventProxy.dll");
     ОбработчикСобытий=СоздатьОбъект("Addin.EventProxy");
     ОбработчикСобытий.ГлубинаБуфераСобытий=200;
     Обработчик=СоздатьОбъект("WbemScripting.SWbemSink");
     ОбработчикСобытий.Источник(Обработчик,"WbemScripting.SWbemSink","WMISink");
     personate}!\\.\root\default");
     objWMIServices.ExecNotificationQueryAsync(Обработчик,
     "Select * from RegistryValueChangeEvent Where
     |Hive = 'HKEY_LOCAL_MACHINE' and
     |KeyPath = 'SYSTEM\\ControlSet001\\Control' and
     |ValueName = 'CurrentUser'");
КонецПроцедуры      // ПриОткрытии

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
     Если (Источник="WMISink") и (Событие="OnObjectReady") Тогда
           Д=ЗначениеИзСтрокиВнутр(Данные);
           WMIObj=ОбработчикСобытий.ПолучитьОбъект(Д.ПолучитьЗначение(1));
           Сообщить(WMIObj.GetObjectText_());
     КонецЕсли;
КонецПроцедуры      // ОбработкаВнешнегоСобытия[/code]
« Последняя редакция: 07. Декабря 2006 :: 18:09 - steban »  

RegistryChangeEvent_001.ert ( 7 KB | Загрузки )

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #12 - 12. Июля 2006 :: 09:14
Печать  
steban писал(а) 12. Июля 2006 :: 06:27:
Принимаются предложения как покрасИвше реализовать сериализацию параметров (чтобы было легко разбирать строку).
А также чтобы обойти грабли с параметрами типа строка, в которой встречается разделитель "|"

Ну что никаких идей?
Может что-нибудь типа MIME?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #13 - 12. Июля 2006 :: 10:02
Печать  
А может параметры передавать Структурой/СЗ или еще каким вариантом?
Уж очень не хочется парсить строку, к ошибкам в итоге может приведет...
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #14 - 12. Июля 2006 :: 10:21
Печать  
Arta писал(а) 12. Июля 2006 :: 10:02:
А может параметры передавать Структурой/СЗ
Код
Выбрать все
HRESULT ExternalEvent(BSTR bstrWho, BSTR bstrWhat, BSTR bstrData) 


Так определен интерфейс IAsyncEvent и я тут ничего поделать не могу.
Все параметры нужно утрамбовать в одну строку с возможностью получить их значения из этой строки (а возможно и имена). Так что структура не подойдет.

Может попробовать в таком формате, чтобы потом можно было сделать
Код
Выбрать все
СписокПараметров=ЗначениеИзСтрокиВнутр(Данные) 

?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #15 - 12. Июля 2006 :: 10:50
Печать  
Погоди, погоди... Надо подумать тщательнее... Я уже столкнулся в ULE с передачей через "|" и славливал пару раз косяки.

Может и строка для СЗ... А не проще тогда сразу компонентой создавать СЗ и передавать его в качестве списка параметров?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #16 - 12. Июля 2006 :: 11:12
Печать  
Arta писал(а) 12. Июля 2006 :: 10:50:
А не проще тогда сразу компонентой создавать СЗ и передавать его в качестве списка параметров?

Компонента, получив событие, вызывает IAsyncEvent->ExternalEvent и больше ничего не делает.
Процедуру ОбработкаВнешнегоСобытия вызывает движок 1С, когда решит, что он может заняться всякой фигней типа обработки внешних событий. Если вызывать процедуру из ВК, то обработчик надо будет выполнять в отдельном потоке. Печаль (или смириться с возможной потерей событий)
Так что параметры надо ухитриться утрамбовать в одну строку (3-й параметр в вызове ExternalEvent).
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #17 - 12. Июля 2006 :: 11:23
Печать  
У списка значения вроде есть ВСтрокуСРазделителями/ИзСтрокиСРазделителями, а радужные хейдеры вроде подключены. Хотя автору виднее.
  
Наверх
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #18 - 12. Июля 2006 :: 11:25
Печать  
Компонента написана по "Технологии создания внешних компонент" от 1С. Без использования хедеров от "Радуги".
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: ВК для асинхронной обработки событий COM-объек
Ответ #19 - 12. Июля 2006 :: 13:12
Печать  
steban
Может, вместо сериализации данные события сохранять в самом обработчике?
Например так:
Код
Выбрать все
// Данные - это ключ хэш-таблицы.
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
	Если (Источник="Аутглюк") и (Событие="ItemSend") Тогда
		Письмо=ОбработчикСобытий.ПолучитьДанные(Данные);
		Сообщить(Письмо.Subject);
	КонецЕсли;
КонецПроцедуры	// ОбработкаВнешнегоСобытия  

  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #20 - 12. Июля 2006 :: 13:38
Печать  
Палыч писал(а) 12. Июля 2006 :: 13:12:
Может, вместо сериализации данные события сохранять в самом обработчике?

Хороший вариант, только тогда на совести разработчика будет удаление данных события из хранилища обработчика.
(или удалять их при первом получении..).
Плюс еще хранение данных события в обработчике продлит жизнь некоторым параметрам....
Будем думать....
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #21 - 12. Июля 2006 :: 13:48
Печать  
Палыч писал(а) 12. Июля 2006 :: 13:12:
Может, вместо сериализации данные события сохранять в самом обработчике?

Очень удобный вариант! Я всеми руками за! Улыбка
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #22 - 12. Июля 2006 :: 14:13
Печать  
ИМХО нужно добавлять внутрь 1С++
Фича красиво переплетается с АктивИкс.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #23 - 12. Июля 2006 :: 14:51
Печать  
artbear писал(а) 12. Июля 2006 :: 14:13:
ИМХО нужно добавлять внутрь 1С++

IAsyncEvent удобен тем, что содержит очередь событий. Нудобен тем, что всего один текстовый параметр и нет возможности вернуть источнику параметр, переданный по ссылке.
При написании сего в составе 1С++ (или как ВК по технологии Rainbow) возникает соблазн не использовать IAsyncEvent, а вызывать обработчик напрямую (с нужным количеством параметров нужных типов и с возможностью вернуть источнику параметры, переданные по ссылке).
Вот только я не представляю как поведет себя 1С при попытке выполнить код через CBLModule::CallAsFunc во время формирования какого-нибудь отчета. Событие ведь может возникнуть в любой момент.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #24 - 12. Июля 2006 :: 15:03
Печать  
Попробовал парочку тестов. Сложилось впечатление, что код 1С, вызванный из ВК через CBLModule::CallAsFunc не начнет выполняться, пока не закончится выполнение другого кода.
Так ли это?
Точный ответ, наверное знает АЛьФ или orefkov.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #25 - 12. Июля 2006 :: 15:08
Печать  
Дык может другим потоком? Вроде реализовывали в 1cpp?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #26 - 12. Июля 2006 :: 15:14
Печать  
Arta писал(а) 12. Июля 2006 :: 15:08:
Дык может другим потоком?

нафих-нафихArta писал(а) 12. Июля 2006 :: 15:08:
Вроде реализовывали в 1cpp?
и где сейчас этот функционал? отправлен в топку.....
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: ВК для асинхронной обработки событий COM-объек
Ответ #27 - 12. Июля 2006 :: 15:25
Печать  
Другим потоком можно собирать данные и запихивать в очередь, но без обращения к 1С.
Но отправлять в 1С, видимо, нужно основным потоком...
  

De quelle planète es-tu?
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #28 - 12. Июля 2006 :: 20:36
Печать  
Я пришел к выводу, что нужны оба варианта:
  • реализация в виде ВК (ТСВК от 1С) и передача событий в 1С через IAsyncEvent:
    Источник событий уведомил 1С о произошедшем событии и пошел выполняться дальше.
    минусы: нет возможности управлять дальнейшим выполнением источника (через параметры, передаваемые по ссылке) и всякие заморочки с сериализацией/десериализацией.
  • В составе 1С++:
    1С что-то долгое делает, вдруг возникает событие. Обработчик события ждет, пока 1С не закончит свои дела.
    Вместе с ним тихонько курит в сторонке источник событий, дожидаясь завершения работы обработчика.
    НО: можно реализовать передачу нужного количества параметров в обработчик на языке 1С(в т.ч. и параметры по ссылке) без сериализации/десериализации.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #29 - 26. Июля 2006 :: 10:08
Печать  
"Ошибка при выполнении метода объекта компоненты"
По каким причинам может выдавать такое ?
  

Константин
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #30 - 26. Июля 2006 :: 10:13
Печать  
мульон причин, думаю...
  
Наверх
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #31 - 26. Июля 2006 :: 10:23
Печать  
Да я просто запускаю обработку "EventProxy.ert" - и сразу это получаю.
И еще: какой ProgID указать для 1С? Да и вообще: как применить эту ВК к 1С - к текущей БД, к другим?
  

Константин
Наверх
 
IP записан
 
trdm
1c++ power user
qt1l developer
1c++ moderator
Отсутствует



Сообщений: 2343
Местоположение: г. Ростов-на-Дону
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #32 - 26. Июля 2006 :: 11:20
Печать  
Цитата:
И еще: какой ProgID указать для 1С?

Это должно быть обозначено в документации (сам пока не читал...).
  
Наверх
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #33 - 26. Июля 2006 :: 11:47
Печать  
Цитата:
Это должно быть обозначено в документации

А она есть?
  

Константин
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #34 - 26. Июля 2006 :: 15:04
Печать  
Поищи в нете Com Explorer
Он тебе даст список ActiveX, DLL, и EXE объектов зарегистрированнных в системе. Там же увидишь ProgID
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #35 - 26. Июля 2006 :: 15:28
Печать  
Цитата:
Да и вообще: как применить эту ВК к 1С - к текущей БД, к другим?

Никак. 1С не генерирует событий при работе в качестве Automation-сервера.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #36 - 26. Июля 2006 :: 16:32
Печать  
Цитата:
Никак. 1С не генерирует событий при работе в качестве Automation-сервера

А если использовать 1С как OLE-объект?
  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
ВК для асинхронной обработки событий COM-объектов
Ответ #37 - 26. Июля 2006 :: 17:34
Печать  
Дык один хрен.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #38 - 26. Июля 2006 :: 17:41
Печать  
Получается, что в 1С я не могу видеть, что делается в 1С ? И даже в MLG...
  

Константин
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #39 - 29. Июля 2006 :: 09:53
Печать  
Цитата:
Никак. 1С не генерирует событий при работе в качестве Automation-сервера.

Кстати , Steban, в параллельной ветке на мой вопрос "выполнить процедуру/функцию у всех" ты мне ответил: "ВК для асинхронной обработки событий". Так что, круг замкнулся?
  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
ВК для асинхронной обработки событий COM-объектов.
Ответ #40 - 31. Июля 2006 :: 06:10
Печать  
Там тебе рекомендовали использовать ТП. ИМХО для задачи, которую ты обрисовал - это самый правильный путь.

Если все-таки очень нужно обмениваться сообщениями между различными экземплярами 1С на клиентах, то Цитата:
Останется написать простейший COM+ сервис и придумать формат сообщений.

Варианты использования:
  • уведомление клиентов об изменении остатков
  • чат или просто отсылка сообщений от админа
  • принудительный сброс кэша скомпилированных модулей классов на клиентах
  • сервер приложений для 7.7: на сервере работают несколько экземпляров 1С - роботов, которые получают через этот сервис запросы на обслуживание (формирование отчетов, проведение документов и т.п.) и через него же возвращают клиентам результаты.  Смех
  • еще какая нибудь безумная затея с асинхронным обменом сообщениями.


ЗЫ: Система поддержки событий COM+
« Последняя редакция: 31. Июля 2006 :: 08:19 - steban »  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
КилоГрамм
Senior Member
****
Отсутствует


Таити, Таити...

Сообщений: 434
Зарегистрирован: 14. Июня 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #41 - 02. Августа 2006 :: 07:26
Печать  
Цитата:
Если все-таки очень нужно обмениваться сообщениями

Не в сообшениях дело.
В глобальном модуле есть процедура ОбновитьТаблицу()
Нужно, чтобы при записи документа у любого пользователя (если в проыедуре ПриЗаписи есть команда), эта процедура запустилась у ВСЕХ активных пользователей. Вот и всё.
Казалось бы проще не бывает...
  

Константин
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #42 - 18. Сентября 2006 :: 09:21
Печать  
Добавлено свойство ГлобальныйКонтекст.
Изменен способ передачи параметров в обработчик: теперь параметры передаются через сериализованный список значений.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #43 - 18. Сентября 2006 :: 10:14
Печать  
steban писал(а) 18. Сентября 2006 :: 09:21:
Добавлено свойство ГлобальныйКонтекст.
Изменен способ передачи параметров в обработчик: теперь параметры передаются через сериализованный список значений.



Чуть поподробней можно?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #44 - 18. Сентября 2006 :: 10:24
Печать  
Проще объяснить кодом
Код
Выбрать все
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
	Если (Источник="ОчередьСообщений") и (Событие="Arrived") Тогда
		//Event Arrived(Queue As Object, Cursor As Long)
		Параметры=ЗначениеИзСтрокиВнутр(Данные);
		Оч=EventProxy.ПолучитьОбъект(Параметры.ПолучитьЗначение(1));
		Сообщение=Оч.ReceiveCurrent();
		//Тут обрабатываем сообщение
		Сообщить(Сообщение.Body);
		Очередь.EnableNotification(ОбработчикСобытийОчереди);
	КонецЕсли;
КонецПроцедуры	// ОбработкаВнешнегоСобытия 

  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #45 - 18. Сентября 2006 :: 13:29
Печать  
Ок! теперь все понятно!
  
Наверх
 
IP записан
 
Dolter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 6
Зарегистрирован: 24. Февраля 2007
Re: ВК для асинхронной обработки событий COM-объек
Ответ #46 - 24. Февраля 2007 :: 12:29
Печать  
А почему вот так не получается:
Код
Выбрать все
ЗагрузитьВнешнююКомпоненту("EventProxy.dll");

Обработчик = СоздатьОбъект("InternetExplorer.Application");
Обработчик.Visible = 1;
Обработчик.Navigate("http://www.1cpp.ru/forum/YaBB.pl?num=1152684759");

ОбработчикСобытий = СоздатьОбъект("Addin.EventProxy");
ОбработчикСобытий.ГлубинаБуфераСобытий = 200;
ОбработчикСобытий.Источник(Обработчик, "InternetExplorer.Application", "IE"); 


???

Выдает:
Код
Выбрать все
ОбработчикСобытий.Источник(Обработчик, "InternetExplorer.Application", "IE");
{C:\DISTRIB\GT1CTCPC\1CDB\EXTFORMS\ОБРАБОТКАВНЕШНЕГОСОБЫТИЯ.ERT(27)}: Ошибка при выполнении метода объекта компоненты C:\Program Files\1Cv77\BIN\EventProxy.dll 

  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #47 - 24. Февраля 2007 :: 13:59
Печать  
InternetExplorer.Application почему-то не реализует интерфейс IProvideClassInfo Печаль
Следовательно получить имена событий компонента не может.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Dolter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 6
Зарегистрирован: 24. Февраля 2007
Re: ВК для асинхронной обработки событий COM-объек
Ответ #48 - 27. Февраля 2007 :: 07:39
Печать  
steban писал(а) 24. Февраля 2007 :: 13:59:
InternetExplorer.Application почему-то не реализует интерфейс IProvideClassInfo Печаль
Следовательно получить имена событий компонента не может.

Спасибо...
А вообще-то я хотел "подрубиться" к компоненте RBrowser.dll (http://robert.by.ru/rbrowser.html)  Улыбка
Был бы, как мне кажется, неплохой шанс расширить интерфейсные возможности семерки...
  
Наверх
 
IP записан
 
Dolter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 6
Зарегистрирован: 24. Февраля 2007
Re: ВК для асинхронной обработки событий COM-объек
Ответ #49 - 27. Февраля 2007 :: 08:29
Печать  
Вот так проходит без ошибок:
Код
Выбрать все
ЗагрузитьВнешнююКомпоненту("EventProxy.dll");
ЗагрузитьВнешнююКомпоненту("RBrowser.dll");

Браузер = СоздатьОбъект("RBrowser");
Браузер.Open("http://robert.by.ru");

Обработчик = Браузер.WebBrowser.Document;

ОбработчикСобытий = СоздатьОбъект("Addin.EventProxy");
ОбработчикСобытий.ГлубинаБуфераСобытий = 200;
ОбработчикСобытий.Источник(Обработчик, "RBrowser.Document.1", "RB"); 


... только почему-то никак не могу попасть в обработчик событий Печаль
  
Наверх
 
IP записан
 
Dolter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 6
Зарегистрирован: 24. Февраля 2007
Re: ВК для асинхронной обработки событий COM-объек
Ответ #50 - 27. Февраля 2007 :: 08:35
Печать  
Поторопился... нихрена так не работает...
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #51 - 27. Февраля 2007 :: 08:54
Печать  
А на кой? Не проще Активикс WebBrowser пользовать?
  
Наверх
 
IP записан
 
Dolter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 6
Зарегистрирован: 24. Февраля 2007
Re: ВК для асинхронной обработки событий COM-объек
Ответ #52 - 27. Февраля 2007 :: 09:51
Печать  
Arta писал(а) 27. Февраля 2007 :: 08:54:
А на кой? Не проще Активикс WebBrowser пользовать?

хм... вариант!
а можно примерчик в виде маленького ert? Улыбка
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #53 - 27. Февраля 2007 :: 13:44
Печать  
Код
Выбрать все
Перем Д;
Перем Скрипт;
Перем гРФорма;
//***************************************************************
//***************************************************************
Процедура ПриОткрытии()
	Форма.Заголовок("Проверка гарантийности Qtek");
КонецПроцедуры
//***************************************************************
//***************************************************************
Процедура ПослеОткрытия()
	Попытка
		_Форма = СоздатьОбъект("Форма");
		Д = _Форма.СоздатьЭлементУправленияНаФорме(Форма, СоздатьОбъект("АктивИкс"), "HTTP");
		Д.СоздатьЭУ("Shell.Explorer.2");
		Д.Объект.Visible = - 1;
		Д.Объект.Navigate2("http://service.myqtek.com/rmsLoginBPFI.asp", 4 + 8);
		Д.Объект.StatusBar = -1;
	Исключение
	КонецПопытки;
КонецПроцедуры
//***************************************************************
//***************************************************************
Процедура HTTP_DocumentComplete()
	Если (Д.Объект.Document.URL = "http://service.myqtek.com/rmsLoginBPFI.asp") И (Д.Объект.Document.ReadyState = "complete") Тогда
		Док = Д.Объект.Document;
		IMEI = Док.getElementsByName("txtIMEI");
		IMEI.item(0).Value = Форма.Параметр;

		Отправка = Док.getElementById("cmdSearch");
		Скрипт.Reset();
		Скрипт.AddObject("Отправка", Отправка);
		Скрипт.Eval("Отправка.click()");
	ИначеЕсли (Д.Объект.Document.URL = "http://service.myqtek.com/rmsVerifyIMEI.asp") И (Д.Объект.Document.ReadyState = "complete") Тогда
		Док = Д.Объект.Document;
		Если Найти(Д.Объект.Document.body.innertext, "The IMEI number was confirmed") > 0 Тогда
			Форма.Параметр = "QTEKBP";
		Иначе
			Форма.Параметр = "";
		КонецЕсли;
		Форма.Закрыть();
	КонецЕсли;
КонецПроцедуры
//***************************************************************
//***************************************************************
Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.Language = "javascript";
 

  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #54 - 27. Февраля 2007 :: 13:45
Печать  
У меня все обработки узкоспециализированные. Отсюда может что поймешь...
  
Наверх
 
IP записан
 
Dolter
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 6
Зарегистрирован: 24. Февраля 2007
Re: ВК для асинхронной обработки событий COM-объек
Ответ #55 - 27. Февраля 2007 :: 18:06
Печать  
Arta писал(а) 27. Февраля 2007 :: 13:45:
У меня все обработки узкоспециализированные. Отсюда может что поймешь...

Спасибо! Очень помогло.
Единственное намучался с установкой DataSource у грида... Пришлось через ж... делать...
Код
Выбрать все
	Грид = СоздатьОбъект("АктивИкс") ;
	АтрФормы.УстановитьАтрибут(Форма,"тАтрГрид");
	АтрФормы.СоздатьЭлементУправления(Грид);
	ОбъектГрид = Грид.СоздатьЭУ("MSDataGridLib.DataGrid.1");
	Грид.ОбработкаСобытий = 1;

	Данные = СоздатьОбъект("АктивИкс") ;
	АтрФормы.УстановитьАтрибут(Форма,"тАтрДанные");
	АтрФормы.СоздатьЭлементУправления(Данные);
	ОбъектДанные = Данные.СоздатьЭУ("MSAdodcLib.Adodc");
	Данные.ОбработкаСобытий = 1;
    
	ОбъектДанные.ConnectionString = "Driver={SQL Server};Server=(local); Database=prj1;Trusted_Connection=Yes;";
	ОбъектДанные.CommandType = 1;
	ОбъектДанные.RecordSource = "select * from table";
	ОбъектДанные.Refresh();

	Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
	Скрипт.Language="vbscript";
	Скрипт.AddObject("o1", ОбъектГрид);
	Скрипт.AddObject("o2", ОбъектДанные);
	Скрипт.ExecuteStatement("set o1.DataSource = o2");  

  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #56 - 28. Февраля 2007 :: 05:48
Печать  
Arta писал(а) 27. Февраля 2007 :: 13:44:
Код
Выбрать все
Процедура ПриОткрытии()
	Форма.Заголовок("Проверка гарантийности Qtek");
КонецПроцедуры
 


ОФФ. Подскажи, а как можно проверить мой Qtek - типа серый или белый он?
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #57 - 28. Февраля 2007 :: 20:34
Печать  
artbear писал(а) 28. Февраля 2007 :: 05:48:
ОФФ. Подскажи, а как можно проверить мой Qtek - типа серый или белый он?

Узрел  Смех
На том сайте если проходит,  то гарантия БрайтПоинта, эта компания официально ввозит в Россию аппараты.
Кидай в аську имей, пробью аппарат Улыбка
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #58 - 28. Февраля 2007 :: 20:39
Печать  
Dolter писал(а) 27. Февраля 2007 :: 18:06:
Спасибо! Очень помогло.
Единственное намучался с установкой DataSource у грида... Пришлось через ж... делать...

Опять не понял. А зачем юзать грид для данных скуля, если есть ТП? Которое проще использовать в 1С?
Или я чего то упустил?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #59 - 17. Марта 2008 :: 13:34
Печать  
steban писал(а) 24. Февраля 2007 :: 13:59:
InternetExplorer.Application почему-то не реализует интерфейс IProvideClassInfo Печаль

Добавлена поддержка объектов, не реализующих IProvideClassInfo.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #60 - 20. Марта 2008 :: 18:15
Печать  
steban писал(а) 17. Марта 2008 :: 13:34:
Добавлена поддержка объектов, не реализующих IProvideClassInfo.


Степ, какие именно события IE можно будет ловить? DocumentComplete, DownloadComplete и т.д.? Или я не о том?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #61 - 20. Марта 2008 :: 19:34
Печать  
Arta писал(а) 20. Марта 2008 :: 18:15:
какие именно события IE можно будет ловить?

все
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #62 - 21. Марта 2008 :: 09:13
Печать  
steban писал(а) 20. Марта 2008 :: 19:34:
Arta писал(а) 20. Марта 2008 :: 18:15:
какие именно события IE можно будет ловить?

все

События джава-скрипта же не отловишь Улыбка Поэтому и спросил Улыбка
Ясно. Сенкс!
  
Наверх
 
IP записан
 
Enterprise Integrator
YaBB Newbies
*
Отсутствует


Мы стираем границы для
разработчиков

Сообщений: 6
Местоположение: Санкт-Петербург
Зарегистрирован: 15. Апреля 2008
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #63 - 08. Июля 2008 :: 10:35
Печать  
А как использовать с ADODB.Connection?
           
Код
Выбрать все
ОбработчикСобытий=Новый ("Addin.EventProxy");
ОбработчикСобытий.ГлубинаБуфераСобытий=200;
Обработчик= Новый COMОбъект("ADODB.Connection");
Обработчик.ConnectionString = СтрокаПодключения;
Обработчик.ConnectionTimeout=0;
Обработчик.CursorLocation=3;
Обработчик.Open();
ОбработчикСобытий.Источник(Обработчик,"ADODB.Connection","ADO");
АсинхронныйОбъект=ОбработчикСобытий.ПолучитьОбъект(" ");  



Что передать в функцию ПолучитьОбъект чтобы вернуть объект?
  
Наверх
wwwGTalk  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #64 - 08. Июля 2008 :: 11:16
Печать  
После вызова "Источник" настройка обработчика закончена.
Обработка событий происходит в процедуре ОбработкаВнешнегоСобытия.

Код
Выбрать все
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
	Если Источник="ADO" Тогда
		Д=ЗначениеИзСтрокиВнутр(Данные);
		Если Событие="Disconnect" Тогда
			adStatus=Д.ПолучитьЗначение(1);
			pConnection=ОбработчикСобытий.ПолучитьОбъект(Д.ПолучитьЗначение(2));
			//что-то с этим делаем :)
		ИначеЕсли Событие="ExecuteComplete" Тогда
			//......................
		КонецЕсли;
КонецПроцедуры	// ОбработкаВнешнегоСобытия
 

  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Enterprise Integrator
YaBB Newbies
*
Отсутствует


Мы стираем границы для
разработчиков

Сообщений: 6
Местоположение: Санкт-Петербург
Зарегистрирован: 15. Апреля 2008
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #65 - 09. Июля 2008 :: 17:37
Печать  
Пытаюсь взлететь на 8.1

В данных по событию "ConnectComplete" получаю след строку  Ужас
{"S","0","0","0","0","0","???"},""}}}

В 8 список значений
Код
Выбрать все
ЗначениеВСтрокуВнутр(Новый СписокЗначение())="{""#"",4772b3b4-f4a3-49c0-a1a5-8cb5961511a3,
|{3,1e512aab-1b41-4ef6-9375-f0137be9dd91,0,0,
|{0},
|{""Pattern""}
|}
|}" 



Соотвественно ЗначениеИзСтрокиВнутр(Данные) всегда возвращает неопределенно.
Как всетаки получить объект ?

И примера метода Сериализовать тоже нигде не нашел
  
Наверх
wwwGTalk  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #66 - 09. Июля 2008 :: 17:48
Печать  
Цитата:
ЗначениеИзСтрокиВнутр(Данные) всегда возвращает неопределенно

Ну да, логично.
Формат сериализации рассчитан на 7.7.
Доработаю.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Enterprise Integrator
YaBB Newbies
*
Отсутствует


Мы стираем границы для
разработчиков

Сообщений: 6
Местоположение: Санкт-Петербург
Зарегистрирован: 15. Апреля 2008
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #67 - 09. Июля 2008 :: 17:51
Печать  
Класс C нетерпением жду.
  
Наверх
wwwGTalk  
IP записан
 
Enterprise Integrator
YaBB Newbies
*
Отсутствует


Мы стираем границы для
разработчиков

Сообщений: 6
Местоположение: Санкт-Петербург
Зарегистрирован: 15. Апреля 2008
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объек
Ответ #68 - 10. Июля 2008 :: 07:23
Печать  
В 8.1 реализованы замечательные вещи связанные с фоновыми процессами. Однако их использование довольно осложнено тем что, при завершении фонового задания выполняемого на сервере клиент никак не узнает, что фоновое задание завершено, пока не обратиться к менеджеру фоновых заданий, а конструкция ОбработкаОповещения на сервере не работает. Таки образом повсеместное применение фоновых процессов осложнено.  Может конечно не очень по адресу .. но тема соотвествует  Подмигивание.

Можно осуществить подписку с помошью Вашей ВК на фоновое здание, и в случае его завершения генерировалось бы внешенее событие,  о завершении фонового процесса с таким то ключом?
  
Наверх
wwwGTalk  
IP записан
 
Scruoge
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 29. Января 2009
Re: ВК для асинхронной обработки событий COM-объектов.
Ответ #69 - 29. Января 2009 :: 20:23
Печать  
Код
Выбрать все
перем ИсточникСобытий, ОбработчикСобытий;

Процедура ПриОткрытии()
	ЗагрузитьВнешнююКомпоненту("EventProxy.dll");
	ОбработчикСобытий = СоздатьОбъект("Addin.EventProxy");
	ОбработчикСобытий.ГлубинаБуфераСобытий = 200;
	ИсточникСобытий = СоздатьОбъект("MyProxyServer.MyProxy");
	ОбработчикСобытий.Источник(ИсточникСобытий, "MyProxyServer.MyProxy", "Proxy");
КонецПроцедуры	// ПриОткрытии

Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
	Сообщить(Источник + ": " + Событие + "('" + Данные + "')");
КонецПроцедуры
 



Вот этот код. Валится на вызове ОбработчикСобытий.Источник(...)
Ошибка при выполнении метода объекта компоненты EventProxy.dll

Мой объект создавался в Builder 2007 c помощью мастера (поскольку сам я в COM пока-что чайник), подозреваю что должно быть нормально все там с IProvideClassInfo, а даже если и нет, то все равно последняя версия EventProxy.dll должна работать...
Не подскажешь в какую сторону копать ?
  
Наверх
 
IP записан
 
Elek
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 24. Декабря 2008
Re: ВК для асинхронной обработки событий COM-объектов.
Ответ #70 - 13. Февраля 2009 :: 12:46
Печать  
А можно штатными средствами отписаться от получения событий WMI?
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объектов.
Ответ #71 - 30. Июня 2009 :: 14:45
Печать  
Кто-нибудь делал с помощью этой компоненты подписку на событие отсоединения сессии на терминальном сервере? Поделитесь кодом, а то задолбался искать. Не получилось даже тест запустить (событие если нагрузка процессора больше 40%, и несколько других примеров):
Код
Выбрать все
	    ОбработчикСобытий = СоздатьОбъект("Addin.EventProxy");
	    ОбработчикСобытий.ГлубинаБуфераСобытий = 200;
	    Обработчик = СоздатьОбъект ( "WbemScripting.SWbemSink" );
	    ОбработчикСобытий.Источник ( Обработчик, "WbemScripting.SWbemSink", "WMISink" );
	    objWMIServices = ОбработчикСобытий.ПолучитьОбъект ( "winmgmts:{impersonationLevel=impersonate}!\\.\root\default" );
		т = "SELECT * from __InstanceModificationEvent WITHIN 2 WHERE TargetInstance ISA 'Win32_Processor' and TargetInstance.LoadPercentage > 40";
	    objWMIServices.ExecNotificationQueryAsync ( Обработчик, т ); 


пишет
Код
Выбрать все
objWMIServices.ExecNotificationQueryAsync ( Обработчик,
{Глобальный модуль(938)}: SWbemServicesEx: Недопустимый класс  

  
Наверх
 
IP записан
 
pavlo
1c++ donor
1c++ power user
Отсутствует



Сообщений: 712
Местоположение: г. Новосибирск
Зарегистрирован: 10. Ноября 2006
Пол: Мужской
Re: ВК для асинхронной обработки событий COM-объектов.
Ответ #72 - 16. Декабря 2010 :: 12:00
Печать  
вот так всегда, находишь такое чудо, читаешь и понимаешь, что нашел, что то волшебное и безграничное, но что то такое что твой мозг пока не воспринимает как-то Улыбка

а задавался целью найти варианты реализации обмена сообщениями между пользователями 1с, причем передавая ссылки или ИД13 объектов, чтобы по ним тоже можно было сразу проваливаться в документ, который порекомендовали т .д. почти сделал на скуле почту, но чую это все изобретение велосипеда попахивает Улыбка
  

1с++     3.2.4.1
Formex  2.0.5.99b
Наверх
IP записан
 
dagipo
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Зарегистрирован: 24. Декабря 2010
Re: ВК для асинхронной обработки событий COM-объектов.
Ответ #73 - 24. Декабря 2010 :: 14:01
Печать  
ВК супер. Пробовал ловить события от Skype4COM. Всё ловится замечательно. Только иногда 1С-ина падает. Пока непонятно почему. Использую платформу 8.1.

Вот набор функций для замены семерочного ЗначениеИзСтрокиВнутр

Функция ЗначениеИзСтрокиВнутр77(Стр)
     
     Список = РазобратьСтроку(Стр);
     Возврат ПреобразоватьДанныеСписка(Список);
КонецФункции

Функция ПреобразоватьДанныеСписка(Список)
     
     Если Список[0].Значение = "VL" Тогда
           
           Результат = Новый СписокЗначений;
           Для Каждого ЭлементСписка Из Список[1].Значение Цикл
                 
                 Данные = ПреобразоватьДанныеСписка(ЭлементСписка.Значение[0].Значение);
                 Результат.Добавить(Данные, ЭлементСписка.Значение[1].Значение);
           КонецЦикла;
     ИначеЕсли Список[0].Значение = "S" Тогда
           
           Результат = Список[6].Значение;
     ИначеЕсли Список[0].Значение = "N" Тогда
           
           Результат = Число(Список[6].Значение);
     КонецЕсли;
     Возврат Результат;
КонецФункции

Функция РазобратьСтроку(Знач Стр)
     
     Стр = Сред(Стр, 2, СтрДлина(Стр) - 2);
     Список = Новый СписокЗначений;
     
     Пока СтрДлина(Стр) > 0 Цикл
           Поз = НайтиРазделитель(Стр);
           Символ = Сред(Стр, Поз, 1);
           
           Если Символ = "," Тогда
                 Список.Добавить(Сред(Стр, 2, Поз - 3));
                 Стр = Сред(Стр, Поз + 1);
           ИначеЕсли Символ = "{" Тогда
                 // Ищем равное количество открывающих и закрывающих скобок
                 Открывающих = 1;
                 Закрывающих = 0;
                 Поз2 = Поз + 1;
                 Пока Открывающих <> Закрывающих Цикл
                       
                       Символ = Сред(Стр, Поз2, 1);
                       Если Символ = "{" Тогда
                             Открывающих = Открывающих + 1;
                       ИначеЕсли Символ = "}" Тогда
                             Закрывающих = Закрывающих + 1;
                       КонецЕсли;
                       Поз2 = Поз2 + 1;
                 КонецЦикла;
                 Список.Добавить(РазобратьСтроку(Сред(Стр, Поз, Поз2 - Поз)));
                 Стр = Сред(Стр, Поз2);
                 Если Лев(Стр, 1) = "," Тогда
                       Стр = Сред(Стр, 2);
                 КонецЕсли;
           Иначе
                 Список.Добавить(Сред(Стр, 2, СтрДлина(Стр) - 2));
                 Стр = "";
           КонецЕсли;
     КонецЦикла;
     Возврат Список;
КонецФункции

Функция НайтиРазделитель(Стр)
     
     Для Поз = 1 По СтрДлина(Стр) Цикл
           
           Символ = Сред(Стр, Поз, 1);
           Если Символ = "," ИЛИ Символ = "{" Тогда
                 Возврат Поз;
           КонецЕсли;
     КонецЦикла;
     Возврат 0;
КонецФункции



Еще одна проблема - при попытке использования XMLHTTP восьмерка слетает совсем. Семерка выдает сообщение

Код для 8-ки

Соединение = Новый COMОбъект("Microsoft.XMLHTTP");
ПодключитьВнешнююКомпоненту("Addin.EventProxy");
ОбработчикСобытий = Новый ("Addin.EventProxy");
ОбработчикСобытий.ГлубинаБуфераСобытий = 200;
ОбработчикСобытий.Источник(Соединение,"Microsoft.XMLHTTP","XMLHTTP");

Сори. Не знаю как выделить код.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать