Имя: Пароль:
1C
1С v8
Как из внешней компоненты на С++ вызвать функцию Сообщить 1с 8?
, , ,
0 ProgAL
 
12.07.15
17:25
Добрый день. Есть внешняя компонента на с++ builder. Все что нужно работает нормально. Использование метода AddError интерфейса IErrorLog вызывает утечки памяти. Поэтому хочется вызывать стандартную функцию Сообщить. Как это сделать, если в наличии есть указатель, получаемый в функции Init. Тип указателя IDispatch* .
1 H A D G E H O G s
 
12.07.15
18:51
(0)
1) Сохранить указатель в переменную pconnect:IDispatch;
2) При первом callasfunc

получить свойство appdispatch этого указателя.

delphi, например, сделает invoke за вас вооот так
appdispatch:=OleVariant(pconnect).appdispatch;
и сохранить в какую - то переменную типа OleVariant;
3) Когда надо вызывать все что угодно через appdispatch, например

appdispatch.Сообщить()

appdispatch.NewObject('СписокЗначений')
и хранить в переменных класса OleVariant (Для Дельфи конечно). Если прозрачная обертка с OleVariant не поддерживается вашими псевдоязыками - писать обертки над GetIDsOfName(), Invoke() и.т.д. Пример обертки можно взять в Дельфи, хехехе.
2 H A D G E H O G s
 
12.07.15
18:54
(0) "вызывает утечки памяти."

Как узнал?
3 ProgAL
 
12.07.15
19:26
(2) Сделал 5000 вызовов вывода строки длиной 50 символов подряд. Увидел прирост памяти в диспетечере задач. После закрытия окна сообщений она особо не уменьшилась. Каждый последующий вывод приводит к увеличению памяти, занимаемой процессом 1с.

Спасибо что Вы появились и ответили. appdispatch я получаю успешно и многое работает, например,

Variant pVar;
IDispatch* pAppDispatch;

V_VT(&pVar) = VT_DISPATCH;
V_DISPATCH(&pVar) = pConnect;

pAppDispatch = pVar.OlePropertyGet("AppDispatch");


// работает создание элемента справочника
Variant AAA = Variant(pAppDispatch).OlePropertyGet("Справочники").OlePropertyGet("Номенклатура").OleFunction("СоздатьЭлемент");
AAA.OlePropertySet("Наименование", "Создано из вн. компоненты");
AAA.OleFunction("Записать");


Но вот когда я пытаюсь выполнить команду языка 1С "Выполнить"

Variant(pAppDispatch).OleFunction("Execute", TextCommamd);
вылезает "функция не найдена".  Пробовал и "Message" вместо "Execute".
4 ProgAL
 
12.07.15
19:27
Вместо OleFunction пробовал OleProcedure.
5 H A D G E H O G s
 
12.07.15
19:36
(4) Запилить глобальный модуль с функцией

Функция ВыполнитьВычисление(Выражение,Параметр) Экспорт
    Возврат Вычислить(Выражение);
КонецФункции
6 ProgAL
 
12.07.15
20:13
(5) Спасибо. Так уже что-то шевелится. Застрял на несоответствии типов. А все же другого способа нету, чтобы не менять текст конфигурации.
7 H A D G E H O G s
 
12.07.15
20:13
(6) Не использовать Выполнить()
8 ProgAL
 
12.07.15
20:39
(7) Это понятно, а как именно достучаться до Сообщить ?
9 H A D G E H O G s
 
12.07.15
20:41
(8)
Variant(pAppDispatch).OleFunction("Сообщить");

не?
10 ProgAL
 
12.07.15
20:54
(9) Нет, я уже про это писал и ОлеФункшн и ОлеПроцедуре, и анлийское название Сообщить Message не работают.
11 Serginio1
 
12.07.15
20:54
(9) Я помню в семерке сообщить можно было только через
ExecuteBatch
EvalExpr из-под разных пользователей
12 ProgAL
 
12.07.15
20:55
(11) Это я уже нагуглил давно. В 8-ке такого нет. И примера на ИТС ни одного нет. Даже на Делфи примера нет.
13 H A D G E H O G s
 
12.07.15
21:08
(10) А что пишет?
У меня Дельфи вполне себе находит этот метод с dispID=51
14 ProgAL
 
12.07.15
21:14
Variant(pAppDispatch).OleProcedure("Сообщить", TextCommamd.c_str());
   Variant(pAppDispatch).OleFunction("Сообщить", TextCommamd.c_str());

Теперь и у меня работает в 2 вариантах OleProcedure  и  OleFunction. Чудеса. Всем спасибо.
15 ProgAL
 
12.07.15
21:15
Variant(pAppDispatch).OleFunction("Execute", TextCommamd);
ошибка была во втором параметре, в ошибочном случае AnsiString, а в правильном char*. Извините, кто зря потратил время. Спасибо.
16 H A D G E H O G s
 
12.07.15
21:17
Вы всегда старадали, страдаете и будете страдать со строками, c++ ники. Это вам кара за экзогенный, негуманноидный язык.
17 Serginio1
 
12.07.15
21:17
(0) Впринципе можешь создать внешний отчет из которого и дергать методы
v8: Получение ссылки на элемент ПВХ через COM-коннектор
18 ProgAL
 
12.07.15
21:21
(17) Ага, спасибо.
19 ProgAL
 
12.07.15
21:23
Кстати, память жрется. Субъективно меньше - 2 Мбт на 5000 сообщить, а через AddError было 3,5 - 4 Мбт.
Но просто текст на штатном языке

Для Ы = 1 По 5000 Цикл
        
        Сообщить(" ввввввввввввввввввввввваааааааааааааааааааааааааааааааффффффффффффффффффффффффффффддддддддддддддпппппппп");
        
    КонецЦикла;    

тоже жрет примерно в таком же размере как получилось сейчас.
20 DmitrO
 
12.07.15
21:26
Через IDispatch приложения доступны только функции глобального контекста.
А,
Выполнить - это оператор;
Вычислить - встроенная функция;
поэтому их и нельзя вызвать.
21 H A D G E H O G s
 
12.07.15
21:30
(19) Поставь eurecalog и прекрати страдать.
100500 что у тебя утечка в другом месте
22 ДенисЧ
 
12.07.15
22:03
(16) А шо, длину строки хранить вне самой строки - это эндогенно?
23 H A D G E H O G s
 
12.07.15
22:14
(22) правильно хранить

число ссылок на строку
ее длину
завершать ее нулем (чтобы передавать в c++ winapi)
давать указатель на переменную как указатель на начало области данных строки (опять таки для winapi)
корректно преобразовывать ansistring <-> widestring

Все это Дельфи делает само, автоматом, прозрачно из коробки настолько прекрасно, что остальное кажется кажется какахой мамонта.
Основная теорема систематики: Новые системы плодят новые проблемы.