Как из внешней компоненты на С++ вызвать функцию Сообщить 1с 8? #747688


#0 by ProgAL
Добрый день. Есть внешняя компонента на с++ builder. Все что нужно работает нормально. Использование метода AddError интерфейса IErrorLog вызывает утечки памяти. Поэтому хочется вызывать стандартную функцию Сообщить. Как это сделать, если в наличии есть указатель, получаемый в функции Init. Тип указателя IDispatch* .
#1 by H A D G E H O G s
1) Сохранить указатель в переменную pconnect:IDispatch; 2) При первом callasfunc получить свойство appdispatch этого указателя. delphi, например, сделает invoke за вас вооот так appdispatch:=OleVariant(pconnect).appdispatch; и сохранить в какую - то переменную типа OleVariant; 3) Когда надо вызывать все что угодно через appdispatch, например appdispatch.Сообщить appdispatch.NewObject('СписокЗначений') и хранить в переменных класса OleVariant (Для Дельфи конечно). Если прозрачная обертка с OleVariant не поддерживается вашими псевдоязыками - писать обертки над GetIDsOfName, Invoke и.т.д. Пример обертки можно взять в Дельфи, хехехе.
#2 by H A D G E H O G s
"вызывает утечки памяти." Как узнал?
#3 by ProgAL
Сделал 5000 вызовов вывода строки длиной 50 символов подряд. Увидел прирост памяти в диспетечере задач. После закрытия окна сообщений она особо не уменьшилась. Каждый последующий вывод приводит к увеличению памяти, занимаемой процессом 1с. Спасибо что Вы появились и ответили. appdispatch я получаю успешно и многое работает, например, Но вот когда я пытаюсь выполнить команду языка 1С "Выполнить" Variant(pAppDispatch).OleFunction("Execute", TextCommamd); вылезает "функция не найдена".  Пробовал и "Message" вместо "Execute".
#4 by ProgAL
Вместо OleFunction пробовал OleProcedure.
#5 by H A D G E H O G s
Запилить глобальный модуль с функцией
#6 by ProgAL
Спасибо. Так уже что-то шевелится. Застрял на несоответствии типов. А все же другого способа нету, чтобы не менять текст конфигурации.
#7 by H A D G E H O G s
Не использовать Выполнить
#8 by ProgAL
Это понятно, а как именно достучаться до Сообщить ?
#9 by H A D G E H O G s
Variant(pAppDispatch).OleFunction("Сообщить"); не?
#10 by ProgAL
Нет, я уже про это писал и ОлеФункшн и ОлеПроцедуре, и анлийское название Сообщить Message не работают.
#11 by Serginio1
Я помню в семерке сообщить можно было только через ExecuteBatch
#12 by ProgAL
Это я уже нагуглил давно. В 8-ке такого нет. И примера на ИТС ни одного нет. Даже на Делфи примера нет.
#13 by H A D G E H O G s
А что пишет? У меня Дельфи вполне себе находит этот метод с dispID=51
#14 by ProgAL
Теперь и у меня работает в 2 вариантах OleProcedure  и  OleFunction. Чудеса. Всем спасибо.
#15 by ProgAL
Variant(pAppDispatch).OleFunction("Execute", TextCommamd); ошибка была во втором параметре, в ошибочном случае AnsiString, а в правильном char*. Извините, кто зря потратил время. Спасибо.
#16 by H A D G E H O G s
Вы всегда старадали, страдаете и будете страдать со строками, c++ ники. Это вам кара за экзогенный, негуманноидный язык.
#17 by Serginio1
Впринципе можешь создать внешний отчет из которого и дергать методы
#18 by ProgAL
Ага, спасибо.
#19 by ProgAL
Кстати, память жрется. Субъективно меньше - 2 Мбт на 5000 сообщить, а через AddError было 3,5 - 4 Мбт. Но просто текст на штатном языке Для Ы = 1 По 5000 Цикл          тоже жрет примерно в таком же размере как получилось сейчас.
#20 by DmitrO
Через IDispatch приложения доступны только функции глобального контекста. Вычислить - встроенная функция; поэтому их и нельзя вызвать.
#21 by H A D G E H O G s
Поставь eurecalog и прекрати страдать. 100500 что у тебя утечка в другом месте
#22 by ДенисЧ
А шо, длину строки хранить вне самой строки - это эндогенно?
#23 by H A D G E H O G s
правильно хранить число ссылок на строку ее длину завершать ее нулем (чтобы передавать в c++ winapi) давать указатель на переменную как указатель на начало области данных строки (опять таки для winapi) корректно преобразовывать ansistring <-> widestring Все это Дельфи делает само, автоматом, прозрачно из коробки настолько прекрасно, что остальное кажется кажется какахой мамонта.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям