|
Как из внешней компоненты на С++ вызвать функцию Сообщить 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 Все это Дельфи делает само, автоматом, прозрачно из коробки настолько прекрасно, что остальное кажется кажется какахой мамонта. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |