Форум программистов, компьютерный форум, киберфорум
Наши страницы
1С: Собственные программы
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Gazzi
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 78
1

Не ловится CallBack от внешнего OLE-объекта

28.09.2017, 12:08. Просмотров 474. Ответов 11
Метки нет (Все метки)

Добрый день.
1С-Предприятие77

Имеем DLL-OLE файл. Успешно его RegSvr32. Он успешно подключается, методы/свойства работают.
Код
Obj = СоздатьОбъект("BTZ.Vk");
Obj.Inner("QQ"); // Успешно выводит MsgBox с надписью "QQ"
А каким образом получить от него событие (CallBack) ?
Связка получается поздняя. Понятно обычным методом наверное не пойдёт.
Имеется как всегда обходной манёвр (как всегда "оттуда" - к гландам).
Сначала надо сбацать некий метод (или фуню), передать Obj-екту ссылку и имя процедуры
Код
Obj.OnEvent( ???, "MoyEvent");
В 1С-модуле написать что-то типа
Код
Процедура MoyEvent (параметры, если надо) Экспорт;
А вот как мне получить ссылку на глобальный модуль (или мож ещё на что, например на форму 1С) ???
В тестовом проекте (VB) это всё прекрасно работает.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2017, 12:08
Ответы с готовыми решениями:

Создание объекта "БухгалтерскиеИтоги" по OLE
Здравствуйте, уважаемые форумчане. Недавно столкнулся с задачей, из 1С 82...

Не ловится CallBack при успешной регистрации МиниФильтра
Коллеги, приветствую! Пересобираю минифильтр под разные платформы и...

Почему закрывается окно объекта OLE при открытии другого объекта?
Добрый день! Есть таблица, одно из полей которой - Поле объекта OLE. При...

Поле объекта OLE
Добрый вечер! Уже задавал вопрос, но у меня ничего не получилось. Как сделать...

Присоединение OLE объекта
Здравствуйте. Разобрался с присоединением Ole объекта - спасибо. Но есть...

11
Volexovich
199 / 175 / 29
Регистрация: 24.10.2011
Сообщений: 696
28.09.2017, 13:17 2
Когда ваша dll создаст событие/оповещение, 1с должна принять ее в процедуре

1C
1
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
в модуле формы
0
Gazzi
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 78
28.09.2017, 15:07  [ТС] 3
Когда ваша dll создаст событие/оповещение ...
Моя dll это сможет сделать, как только я ей в первом параметре передам Объектную ссылку на эту форму
(или на модуль формы, не знаю как правильней).
Код
Obj.OnEvent(MoyForm, "MoyEvent");
Как мне получить указатель на объект, который я обозвал "MoyForm" ?
... 1с должна принять ее в процедуре в модуле формы
Не хочет она ничего принимать в процедуре
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
А что должно быть в "Источник" и в "Событие" ?
0
Volexovich
199 / 175 / 29
Регистрация: 24.10.2011
Сообщений: 696
28.09.2017, 16:08 4
Ничего не понял, но вот правила работы с компонентами в 7:
1. 7 принимает события только в активное окно
2. компоненту надо подключать в глобальном модуле при запуске системы
3. Вызов обработчика ловится в активную форму через процедуру ОбработкаВнешнегоСобытия()
0
Gazzi
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 78
28.09.2017, 17:15  [ТС] 5
... правила работы с компонентами в 7:
Да НЕТ, всё равно НЕ работает !

Интересно, а Внешняя Компонента и просто OLE-объект - Это одно и тоже ?
А то если писать "по правилам" внешнюю компоненту - там ещё всякие танцы с бубном предстоят.
И как раз один из интерфейсов на тему CallBack-анья !
Может и ОбработкаВнешнегоСобытия() предназначена исключительно для "правильных" компонентов ?

Чож остаётся, Таймер применить, да пущай опрашивает мой Obj-ект ?
Или "Воткнуть" ещё одну связь, DDE-канал например.
Или может быть как-то теперь со стороны объекта подключить ту же самую 1с-ку ?

В 1С-ке нету разве эквивалентов операторов типа:
GetObject
Me
This
CallByName
И прочих, для работы с указателями ?
0
Dethmontt
Модератор
Эксперт 1С
2643 / 2436 / 415
Регистрация: 10.03.2011
Сообщений: 8,699
Записей в блоге: 1
Завершенные тесты: 1
29.09.2017, 11:54 6
Цитата Сообщение от Gazzi Посмотреть сообщение
В 1С-ке нету разве эквивалентов операторов типа:
GetObject
Me
This
CallByName
И прочих, для работы с указателями ?
есть, но так просто, как ты хочешь, в компоненту не передать указатель )))

Добавлено через 3 минуты
ИТС

Инициализация и выгрузка компоненты

Для инициализации и выгрузки компоненты используется интерфейс IInitDone. Этот интерфейс наследован от IUnknown и предназначен для инициализации объекта и завершения работы с объектом.

Init

Синтаксис:

HRESULT Init(IDispatch *pBackConnection)

Параметры:

<pBackConnection> Тип: IDispatch. Указатель на интерфейс 1С:Предприятия.

Возвращаемое значение:

E_FAIL - при инициализации произошла ошибка
S_OK - инициализация прошла успешно
Описание:

При загрузке 1С:Предприятие инициализирует объект компоненты, вызывая метод Init и передавая указатель на IDispatch. Объект может сохранить этот указатель для дальнейшего использования. Все остальные интерфейсы 1С:Предприятия объект может получить, вызвав метод QueryInterface переданного ему интерфейса IDispatch. Объект должен возвратить S_OK, если инициализация прошла успешно, и E_FAIL при возникновении ошибки. Данный метод может использовать интерфейс IErrorLog для вывода информации об ошибках. При этом инициализация считается неудачной, если одна из переданных структур EXCEPINFO имеет поле scode, не равное S_OK. Все переданные в IErrorLog данные обрабатываются при возврате из данного метода. В момент вызова этого метода свойство AppDispatch не определено.
0
Gazzi
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 78
29.09.2017, 16:55  [ТС] 7
эквиваленты операторов ... есть
Какие это операторы ???
Очень прошу: Приведите пример пжлст!

... просто, как ты хочешь, в компоненту не передать указатель
Я очень просто, как я хочу, в свой OLE-объект (НЕ ВК, которая с бубном пляшется) передам указатель.
Что я там с ним буду делать - это другой вопрос, главное: как взять.

Указатель внешнего (моего) OLE-объекта прекрасно передётся в другой (мой) OLE-объект,
и во втором (моём) OLE-объекте он настолько прекрасно распознаётся, что позволяет вызвать процедуру
в первом (моём) объекте.
(Получаем пародию на CallBack, но только между моими объектами).

В принципе не понимаю: Зачем нам нужна ВнешняяКомпонента с лишними танцами ?
Если "просто объект" и так пашет изумительно.
И если бы не кастрированный Бейсик в 1С - моя жизнь была бы Счастье.
0
GreenkA
29.09.2017, 18:22
  #8

Не по теме:

Dethmontt, УРЯ! Дениска вернулся:yahoo::friends:

0
Dethmontt
Модератор
Эксперт 1С
2643 / 2436 / 415
Регистрация: 10.03.2011
Сообщений: 8,699
Записей в блоге: 1
Завершенные тесты: 1
01.10.2017, 07:34 9
Цитата Сообщение от Gazzi Посмотреть сообщение
Очень прошу: Приведите пример пжлст!
Цитата Сообщение от Gazzi Посмотреть сообщение
GetObject
This
.............

Добавлено через 1 минуту
Цитата Сообщение от Gazzi Посмотреть сообщение
Я очень просто, как я хочу, в свой OLE-объект (НЕ ВК, которая с бубном пляшется)
давайте для начала попытаемся сформулировать что же такое ОЛЕ ?
0
Gazzi
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 78
01.10.2017, 15:08  [ТС] 10
GetObject
This
.............
Ну так ЕСТЬ подобное в 1С или нет ? ... Пример-то можно ???
... попытаемся сформулировать ...
Всё уже в 90-е годы за нас сформулировали, чо ж ещё формулировать-то...
Не нравится моё обзывание "ОЛЕ" - назовите как угодно (COM, ActiveX и прочими словами
из "трех букв", я не обижусь), ловить от этого калбаки в эс-ке он не научится.
Зачем к словам цепляться.

И виноват в этом не ОЛЕ/КОМ/Активе.Объект, а как раз Эска, потому как не умеет
организовывать двустороннюю связь при позднем связывании
(или мне неизвестно об этом, потому и спрашиваю).

А не умеет она этого делать, потому-что нет (или мне неизвестны) операторы/механизмы
обращения к процедурам/функциям/переменным в других модулях программы 1С в одном
адресном пространстве процесса (даже с волшебным словом "Экспорт").
Ну как мне "увидеть":
Код
Перем МояПеременная Экспорт;

Процедура МояПроцедура Экспорт;
КонецПроцедуры
Из моего ОбзовиКакХочешь.Object-а ???

Я же вижу из своего Obj1 фуню в своём Obj2, прекрасно её вызываю. А откуда Obj2 знает о
существовании Obj1 и фуни в нём ? А это я ему рассказываю преред эксплуатацией,
вызывая другую фуню/процу:
Код
Obj2.ПримиКонцыДляСвязи(Obj1, "ТебяТутЖдут")
По бухгалтерски:
"Дорогой мой Obj2, если тебе стукнет в голову чо-нить передать, то ты это можешь сделать в любое
время дня и ночи, накакав на все таймеры и ОработкиВнешнихСобытий, всего лишь вызвав в объекте
VarPtr(Obj1) фуню с именем"ТебяТутЖдут", и передать параметры в аргументах, которые ты уже знаешь
на стадии твоего программирования" (а может и динамически мы тебе прямо тут о них всё и расскажем)".
Но почему-то я не могу передать:
Код
Obj2.ПримиКонцыДляСвязи(VarPtr("ГлобальныйМодуль"), "МояПроцедура")
Однако это прекрасно делатся со "своими"-1С внутренними объектами (видимо что-то
спрятали, а нам об этом не рассказывает наш дорогой Нурали Григорьевич, редиска, однако).
Вот в связи с чем и ещё вопрос нарисовывается:
Нет ли механизма загрузить сторонний объект до запуска 1С, (как это умеют делать нормальные
среды), что-то типа статической линковки ?

Заостряю Ваше внимание ...
... Я очень просто, как я хочу, в свой ОбзовиКакХочешь-объект ...
Засовываю всё што угодно и вызываю всё что хочу в любое время дня и ночи (накакав на таймеры,
и ОбработкиВнешнихСобытий), в любой модуль, но только в своих объектах, даже подключенных к 1С.
И даже неподдерживемые 1С типы и другие объекты летают туда-сюда "как жаренные веники".

И даже не загоняюсь вопросами типа IDispatch и иже с ними. (Надо пользоваться, а не допиливать под
свои нужды). Этот вопрос я загнал "далеко и без продуктов" ещё где-то в году 1996-м.
Поэтому и спрашиваю:
Есть подобные механизмы в обсуждаемом "изделии" ?

А "система" ОбработкаВнешнегоСобытия( ); - Это некая "Отсебятина" (да ещё и не очень...),
я на такое тоже "горазд - будь здоров". С какой радости я должен свои объекты обзывать со слова "Addin.".
Мне например больше нравится небеззвестное "слово из трёх букв".
И почему я должен обрабатывать эти события только в какой-то открытой/активной форме ?
Задача может стоять например:
Получить количество и цену товара, "ID-такое-то", и совершенно необязательно юзеру-бухгалтеру
открывать какое-то окошко, а тем более, чтоб оно ещё и активным при этом было.
В нормальных "изделиях" они прекрасно обрабатываются в любом модуле.

Это что спецификация COM/OLE/ActiveX, или это всё-таки каприз/неумение некоторых ...
(не будем обзываться).
Раз вы пишете о поддержке COM/OLE/ActiveX - будьте добры поддерживать её, в том числе и
возможностью манипулировать указателями.
Не заставляйте "спрыгивать" на ASM и разыскивать эти указатели/смещения самостоятельно.
(Медицинская теорема о "Дальнем доступе к гландам").

Ещё вопросики...(если можно)...
DDE в 1С тоже односторонняя (именно в 1С, в нормальных средах она "по умолчанию" реверсивная) ?
Можно ли подключиться к уже открытой 1С с помощью CreateObject("V77.Application") ?

Хотя это громозско... Или... Может есть

CreateObject("V77.ЧтоТоПопроще")

Например только доступ к объектам базы, без открытия всей Эски, но обязательно с уже открытой
IDE-1С (Бухгалтезеру надо-ж как-то работать).
Разговор идет в контексте: "Один комп с одной базой, и подключаемся тоже с этого компа".

Не по теме:

А может это я ...
... к Денискам попал ???
0
Dethmontt
Модератор
Эксперт 1С
2643 / 2436 / 415
Регистрация: 10.03.2011
Сообщений: 8,699
Записей в блоге: 1
Завершенные тесты: 1
05.10.2017, 12:55 11
Gazzi, куча текста и ничего по делу...


Что бы получить доступ к 1С из своей компоненты, нужно получить указатель на 1С в IDispatch (других способов я не знаю)

Цитата Сообщение от Gazzi Посмотреть сообщение
Нет ли механизма загрузить сторонний объект до запуска 1С, (как это умеют делать нормальные
среды), что-то типа статической линковки ?
Механизма нет, можешь попробовать сделать inject своего кода в адресное пространство 1С (принцип как работает снегопат от Орефкова)
Цитата Сообщение от Gazzi Посмотреть сообщение
Можно ли подключиться к уже открытой 1С с помощью CreateObject("V77.Application") ?
в 7.7 не знаю, в 8.ке можно, читай про функцию ПолучитьCOMОбъект()
0
Gazzi
-12 / 0 / 0
Регистрация: 28.09.2017
Сообщений: 78
06.10.2017, 10:02  [ТС] 12
... куча текста ...
Ну надо же как-то "донести суть" до оппонента ...
ПолучитьCOMОбъект
Во-во, очень напоминает GetObject, но видимо такого нет в 7-ке. Да и не факт что такой объект увидит наше "невидимое".
CreateObject("V77.Application")
Подключение к себе-же, из самого же подключенного объекта - возможно, под другим (не равным текущему) именем
пользователя. Ну прям какая-то рекусия (Мать ёё) !
Не знаю какие там ещё костыли нас ждут при записи чего-либо в такую "задвоенную" базу, но мне слава богу только
считывать из неё надо.
Интересно, если первый (реальный) пользователь чо-нибудь изменит, второй (виртуальный, то бишь наш V77.Application) эти изменения увидит ?

Ну и DDE ещё в запасе остаётся. Уж она точно умеет Экспортные фуни из Глобала вызывать (применял). Гораздо быстрее подключается, никакого пользователя не требует, будет точно "сидеть" в той же самой базе (или копии базы, не знаю как правильней) и работать под тем-же пользователем.
Однако (насколько я её юзал) умеет только одного "подтыкающегося" обслуживать. Но можно "тройник" сваять.
Но говорят, не поддерживается в Win-7, хотя не испытывал.

А не умеет ли 1С "приклеивать" к своим формам OCX-компоненты ???
(Me.Parent - и больше не загоняемся).

Почему-то 1С-объект тоже "не виден" во внешнем (моём) объекте, например:
Код
     Перем MoyObj Экспорт;
     Перем TextObj Экспорт;
MoyObj = СоздатьОбъект("Buz.BB");
TextObj = СоздатьОбъект("Текст");
	TextObj.ДобавитьСтроку("Некий Текст");
	TextObj.Показать( );
      // Пытаюсь передть ссыль на объект TextObj в свой объект:
MoyObj.SetObject( TextObj ); // Эска Ругается, говорит: Плохой тип переменной
Мы и такой "1С-стандартный" объект не сможем увидеть в своём объекте ???
Или ссылку каким-нибудь ракобоком надо "преобразовать" в "правильный" формат ?

А нет ли какого-нибудь "1С-стандартного" внутреннего объекта, который текст может как программу 1С
запускать (типа Объект.Выполнить("ТекстПрограммы1С"), ну прям скрипт какой-то получается) ???
Вполне бы был полезный объект (опять-же, если-б виден был "снаружи").

Снегопат работает, внедряясь в процесс 1С и взаимодействуя напрямую с функциями движка 1С,
не документируемыми производителем.
Ну говорю-ж, Редиска, нехороший человек, собака, однако ...
Ну ведь как-то он "Программно Обзывается" этот наш треклятый "Глобальный" и самый "Модульный" из всех модулей на свете.
И где-ж бы нам бы его "раздокументировать" ?
... указатель на 1С в IDispatch ...
А что, в структурах OLE найдём ссылку на Родителя нашего подключенного объекта ???
... Инжекция ...
Вроде и так уже "почти инжектированы", осталось родителя нащупать.
Или там какие-то важные разницы имеются ?

Как-то давно я находил указатель на... (уже не помню на что именно) в запущенном exe-файле с помощью API. Именно его не хватало "для полного счастья" фуне CallByName, (и прямым обращениям тоже, типа Object.Метод), работало.
Но ведь Глоб.Модуль ещё будет недокомпилирован (наверное) на момент запуска внешнего объекта, эти указатели уже будут "готовы" к этому моменту, или ещё нет ?
"Поковыряться" в этом направлении ?
0
06.10.2017, 10:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.10.2017, 10:02

Освобождение OLE - объекта
На форме имеется OLE - контейнер, в котором я открываю лист Маткада:...

Шаблоны и функторы как callback для класса свойства объекта. Код работает - но не должен
Здравствуйте! Хочу написать реализацию класса свойства на шаблоне. Т.е есть...

Воспроизведение из объекта OLE кодом
Здравствуйте! Как заставить с помощью кода (а не двойным кликом) выполняться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru