![]() |
![]() |
![]() |
|
Внешняя компонента использует стороннюю DLL | ☑ | ||
---|---|---|---|---|
0
Santiago
18.10.19
✎
11:26
|
Доброго времени суток!
Перерыл все источники. У меня ошибка с загрузкой и использованием внешней компоненты с 1С следующая: 1. Создал ВК при помощи Visual Studio 2017 2. Полученную библиотеку 1С_DLL.dll подключаю следующим образом: ПодключитьВнешнююКомпоненту("d:\1С_DLL.dll", "DemoVK", ТипВнешнейКомпоненты.Native); ДемоКомп = Новый("AddIn.DemoVK.SameName"); пер = ДемоКомп.CallBack("YES!","NO!!"); Сообщить(пер) делаю все на клиенте, платформа 8.3.9.1850 х64 3. Моя компонента использует стороннюю DLL 4. Все работает, но только 1 раз, последующий вызов функции (1С платформа не выключается) выдает ошибку "Не найден файл внешней компоненты" 5. Как только в своей DLL отключаю вызов функций из сторонней DLL, все работает хорошо и без ошибок Помогите разобраться |
|||
1
Garykom
гуру
18.10.19
✎
12:13
|
(0) Работа с памятью неправильная скорее всего.
Забей на ВК и делай на веб-сервисах, это сильно проще. По сути поднимаешь некий сервер (можно и локально на том же компе) и по http с ним. |
|||
2
Santiago
18.10.19
✎
12:42
|
(1) Мне край нужно использовать инструментарий API, который скрыт в сторонней DLL, вот и пытаюсь это делать через ВК (как промежуточное звено)
В целом мне нужно выполнять код на С++ с использованием сторонней DLL Может быть я гружу неправильно ВК? Читал есть варианты использовать через "Общие макеты", но попытки не увечались успехом) |
|||
3
Кирпич
18.10.19
✎
12:56
|
ну и положи свою стороннюю dll куда нибудь в общедоступное место
|
|||
4
Santiago
18.10.19
✎
13:03
|
(3) Везде разложил ее, по всем местам.
Первый раз то платформа ее грузит, все выполнятся отлично. Второй раз ошибка. Если 1С перегрузить, то выполнятся все снова хорошо, но 1 раз. |
|||
5
Garykom
гуру
18.10.19
✎
13:08
|
Хочешь сказать что вот такой неразрывный код глючит? Что делает твоя ВК внутри по вызову CallBack ? |
|||
6
Кирпич
18.10.19
✎
13:17
|
(4) ну может первый раз она её загружает из d:\, а второй раз может скопировала куда и оттуда загружает
|
|||
7
Santiago
21.10.19
✎
10:23
|
(5)
case eCallBack: { if (!lSizeArray || !paParams) return false; s1 = (paParams)->pwstrVal; s2 = (paParams + 1)->pwstrVal; //wstring_to_p(std::wstring(s1 + s2), pvarRetValue); int answerCode = 0; // ВОТ ЭТИ 2 СТРОКИ ОБРАЩАЮТСЯ К ФУНКЦИЯМ ВО ВНЕШНЕЙ DLL answerCode = UF_initialize(); UF_terminate(); // if (answerCode != 1) { wstring_to_p(std::wstring(s1), pvarRetValue); } else { wstring_to_p(std::wstring(s2), pvarRetValue); } Если обращение к функция во внешней DLL убрать (2 строчки помеченные комментариями), то все грузится и работает |
|||
8
Santiago
21.10.19
✎
10:32
|
(7) Повторюсь, все работает и с этими двумя стройками (результатом доволен), но только 1 раз, потом нужно перегрузить платформу 1С. Второй запуск выдает ошибку
|
|||
9
Garykom
гуру
21.10.19
✎
10:34
|
Вопрос был что внутри этих двух строчек. Как там работаем с памятью. И судя по terminate еще и очищать сами пытаемся, что с точки зрения ВК для 1С неправильно.
answerCode = UF_initialize(); UF_terminate(); |
|||
10
Garykom
гуру
21.10.19
✎
10:35
|
Короче грузи в ВК стороннюю DLL а выгружать не надо, сохраняй между вызовами загруженную и используй.
По крайней мере сглючит только при выходе из 1С (отключении ВК). |
|||
11
Santiago
21.10.19
✎
12:37
|
(10) Так я и не выгружаю, просто повторно вызываю VK кнопкой, а там уже что то не так...
Может ее грузить нужно глобально где то при старте платформы 1С, а использовать при нажатии кнопки? Может быть мне поможет способ загрузки через "общие макеты" ? Чем эти два способа отличаются: используемый мной и загрузка через "общие макеты" ? |
|||
12
arsik
гуру
21.10.19
✎
12:46
|
(11) Он тебе про другое говорит.
|
|||
13
Santiago
21.10.19
✎
13:11
|
(12) Поясните как мне заставить не выгружать стороннюю DLL? Это относится к опциям компилятора?
У меня на руках сама DLL, LIB и h-файлы Я подключаю заголовочный файл, указываю в компоновщике соответствующий lib файл и собираю. Запутался в этих дебрях или в двух соснах) |
|||
14
Кирпич
21.10.19
✎
13:17
|
(13) ты на вопрос в (5) так и не ответил
|
|||
15
Garykom
гуру
21.10.19
✎
13:20
|
(13) Убери UF_terminate(); нафик
|
|||
16
Garykom
гуру
21.10.19
✎
13:21
|
(15)+ И переделать answerCode = UF_initialize();
Так чтобы инициализация происходила только один раз при подключении ВК (куда сохранять ссылку сам думай), а в eCallBack просто вызов функций из нее. |
|||
17
Santiago
28.10.19
✎
11:53
|
Очень благодарен разработчикам платформы 1С! Гибкая и универсальная.
Но все что касается ВнешнейКомпоненты это боль, боль и еще раз боль. Для решения моей задачи написал легенькое консольное приложение, работаю через ЗапуститьПриложение(). Результат работы возвращается через КодВозврата. |
|||
18
Garykom
гуру
28.10.19
✎
11:57
|
ВК не нужна если задачу можно решить через веб-сервисы.
Для их написания очень удобно использовать Golang, на выходе exe файл который просто запустить и он поднимает веб-сервер на нужном порту. 1С просто через HTTPСоединение работает с этим портом. Вот если надо обработку внешнего события тут пока никак без ВК или апача/иис. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |